知道为什么当我使用rest api在Cosmos DB中执行下面的查询时,我得到下面的错误?没有订单的相同查询工作正常...
我在两种情况下都设置了标头"x-ms-documentdb-query-enablecrosspartition: True"
,我使用PHP来发出请求。
MULTI PARTITION QUERY的工作原理:
SELECT c.id,c.name,c.age FROM c其中c.age = 30
带错误的MULTI PARTITION QUERY:
SELECT c.id,c.name,c.age FROM c其中c.age = 30 by c.age asc
错误:
客户端错误:
POST https://yeapp-cosmosdb.documents.azure.com//dbs/-JJZAA==/colls/-JJZAL+WPKw=/docs
导致
400 BadRequest
响应:{“code”:“BadRequest”,“message”:“提供的跨分区查询不能直接由网关提供。这是一个(截断...)
我刚才遇到了同样的问题,这在我看来最近才显现出来。我之前没有。当我在带有连接的查询上使用SELECT DISTINCT时,我遇到同样的问题...这就是为什么https://docs.microsoft.com/en-us/rest/api/cosmos-db/querying-cosmosdb-resources-using-the-rest-api#Queries-that-cannot-be-served-by-gateway
如果删除ORDER BY,在我的情况下删除DISTINCT,查询将起作用...
这很不幸。注意:相同的查询可以从Azure门户开始,但不能从REST API开始。然而,Azure门户会强制您浏览分页结果,这不是实现长查询结果或自动化任务的方法......
从上面的链接我们可以看到:
任何需要跨连续状态的查询都不能由网关提供。这包括:按订单排序的最高订单聚合DISTINCT GROUP BY网关可以提供的查询包括:简单投影过滤器
我在使用R脚本发出请求时遇到同样的问题。 DB的索引策略是默认值which includes range and spatial indexes for all items。只要只有一个结果,我的查询按预期工作,没有“ORDER BY”子句,甚至使用“ORDER BY”子句。此外,它在我的“WHERE”子句指定范围时起作用,例如c._ts > 12345678910
,所以我认为ngruson的建议不是问题所在。
根据this page的说法,一个构造不良的JSON附件会产生400错误。
以下是适用的JSON:
{\"query\":\"SELECT TOP 100 * FROM c WHERE c.id = \\\"F6OWIDUtl0PElDAg0BPDr-j\\\" ORDER BY c._ts DESC\",\"parameters\":[]}
这是返回错误的JSON:
{\"query\":\"SELECT TOP 100 * FROM c WHERE c.id != null ORDER BY c._ts DESC\",\"parameters\":[]}
我没有看到明显的区别,所以我假设问题出在其他地方。
(我会在评论中添加这个,但是我不会让我对我的代表级别发表评论,所以它可以在这里“回答”或在其他地方复制问题。)