Cosmos:使用JOIN和ORDER BY

时间:2019-03-06 05:36:37

标签: azure distinct azure-cosmosdb

我正在尝试编写一个查询,该查询使用JOIN对数组中的位置执行地理空间匹配。我可以使用它,但是添加了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子句,它也会返回两次相同的文档。

我在这里做什么错了?

1 个答案:

答案 0 :(得分:0)

根据我的研究,确实复制了您的问题,这似乎是对cosmos db distinct查询的缺陷。请参考以下链接:Provide support for DISTINCT

  

此功能在数据浏览器中已损坏。因为宇宙只能   一次每页返回100个结果,distinge关键字只会   应用于单个页面。因此,如果您的结果集包含超过100个   结果,您仍可能会得到重复-它们只会在   单独分页的结果集。

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