Cosmos DB:网关无法直接提供跨分区查询

问题描述 投票:1回答:2

知道为什么当我使用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”:“提供的跨分区查询不能直接由网关提供。这是一个(截断...)

azure-cosmosdb azure-cosmosdb-sqlapi
2个回答
1
投票

我刚才遇到了同样的问题,这在我看来最近才显现出来。我之前没有。当我在带有连接的查询上使用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网关可以提供的查询包括:简单投影过滤器


0
投票

我在使用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\":[]}

我没有看到明显的区别,所以我假设问题出在其他地方。

(我会在评论中添加这个,但是我不会让我对我的代表级别发表评论,所以它可以在这里“回答”或在其他地方复制问题。)

© www.soinside.com 2019 - 2024. All rights reserved.