首页 > 解决方案 > Cosmos:带有 JOIN 和 ORDER BY 的 DISTINCT 结果

问题描述

我正在尝试编写一个查询,该查询使用 aJOIN对数组中的位置执行地理空间匹配。我得到了它的工作,但添加DISTINCT以消除重复(查询 A):

SELECT DISTINCT VALUE
    u
FROM
    u
JOIN loc IN u.locations
WHERE
    ST_WITHIN(
        {'type':'Point','coordinates':[loc.longitude,loc.latitude]},
        {'type':'Polygon','coordinates':[[[-108,-43],[-108,-40],[-110,-40],[-110,-43],[-108,-43]]]})

但是,我随后发现DISTINCT不支持与延续标记组合,除非您还添加ORDER BY

System.ArgumentException: Distict query requires a matching order by in order to return a continuation token. If you would like to serve this query through continuation tokens, then please rewrite the query in the form 'SELECT DISTINCT VALUE c.blah FROM c ORDER BY c.blah' and please make sure that there is a range index on 'c.blah'. 

所以我尝试ORDER BY像这样添加(查询 B):

SELECT DISTINCT VALUE
    u
FROM
    u
JOIN loc IN u.locations
WHERE
    ST_WITHIN(
        {'type':'Point','coordinates':[loc.longitude,loc.latitude]},
        {'type':'Polygon','coordinates':[[[-108,-43],[-108,-40],[-110,-40],[-110,-43],[-108,-43]]]})
ORDER BY
    u.created

问题是,它DISTINCT似乎不再生效,因为它返回,例如,相同的记录两次。

要重现这一点,请使用以下数据创建一个文档:

{
    "id": "b6dd3e9b-e6c5-4e5a-a257-371e386f1c2e",
    "locations": [
        {
            "latitude": -42,
            "longitude": -109
        },
        {
            "latitude": -42,
            "longitude": -109
        }
    ],
    "created": "2019-03-06T03:43:52.328Z"
}

然后运行上面的查询 A。尽管两个位置都与谓词匹配,但您将得到一个结果。如果您删除DISTINCT,您将获得两次相同的文档。

现在运行查询 B,您将看到它两次返回相同的文档,尽管有DISTINCT子句。

我在这里做错了什么?

标签: azuredistinctazure-cosmosdb

解决方案


确实重现了您的问题,根据我的研究,这似乎是 cosmos dbdistinct查询中的一个缺陷。请参考此链接:提供对 DISTINCT 的支持

此功能在数据资源管理器中被破坏。因为 cosmos 一次只能返回每页 100 个结果,因此 distinct 关键字将仅适用于单个页面。因此,如果您的结果集包含超过 100 个结果,您仍然可能会得到重复的结果 - 它们只会位于单独分页的结果集中。

您可以描述您自己的情况并对此反馈案例进行投票。


推荐阅读