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

时间:2018-12-15 21:40:38

标签: azure-cosmosdb azure-cosmosdb-sqlapi

任何想法为何我在使用其余api在Cosmos DB中执行以下查询时 我收到以下错误?没有顺序的相同查询工作正常...

在两种情况下,我都设置了标题"x-ms-documentdb-query-enablecrosspartition: True",并且我使用PHP发出请求。

有效的多分区查询:

  

从c中选择c.id,c.name,c.age,其中c.age = 30

具有错误的多分区查询:

  

从c中选择c.id,c.name,c.age,其中c.age = 30(按c.age asc排序)

错误:

  

客户端错误:POST https://yeapp-cosmosdb.documents.azure.com//dbs/-JJZAA==/colls/-JJZAL+WPKw=/docs

     

产生400 BadRequest响应:   {“ code”:“ BadRequest”,“ message”:“”提供的跨分区查询可以   不能直接由网关服务。这是(被截断的...)

2 个答案:

答案 0 :(得分: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门户会迫使您浏览分页的结果,这并不是获取长查询结果或自动任务的真正方法。

从上面的链接中我们可以看到:

网关无法服务任何需要跨连续状态的查询。这包括:     最佳     订购     偏移极限     骨料     不同     通过...分组 网关可以提供的查询包括:     简单的预测     过滤器

答案 1 :(得分:0)

我在使用R脚本发出请求时遇到了同样的麻烦。数据库的索引策略是默认的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\":[]}

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

(我会在注释中添加此内容,但是SO不会让我对我的代表级别进行注释,因此它要么在这里“答案”,要么在其他地方重复该问题。)