azure - 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
子句。
我在这里做错了什么?
解决方案
确实重现了您的问题,根据我的研究,这似乎是 cosmos dbdistinct
查询中的一个缺陷。请参考此链接:提供对 DISTINCT 的支持。
此功能在数据资源管理器中被破坏。因为 cosmos 一次只能返回每页 100 个结果,因此 distinct 关键字将仅适用于单个页面。因此,如果您的结果集包含超过 100 个结果,您仍然可能会得到重复的结果 - 它们只会位于单独分页的结果集中。
您可以描述您自己的情况并对此反馈案例进行投票。
推荐阅读
- javascript - JQuery有条件地设置嵌套输入元素的格式化文本
- wordpress - 类别最后一页上的文字(Woocommerce)
- firebase - Firebase API - 从上传的图片中获取 gs url
- pagespeed-insights - 与 Pagespeed Insights 不一致
- python - TypeError: 'int' 和 'str' 的实例之间不支持'<'。标记化字符串 100% 整数
- c++ - 使用柯南找不到图书馆
- rust - 借款检查器抱怨多次借款,而只有一次借款会发生
- python - 如何基于列元素python的子字符串合并熊猫数据框
- ios - xcode 12.4升级导致的objc内存和线程崩溃
- angular - 如何运行@angular-eslint/schematics:convert-tslint-to-eslint