对于Cosmos DB for MongoDB API(版本3.4),以下查找查询与方法游标排序的组合似乎行为不正确:
db.test.find({"field1": "value1"}).sort({"field2": 1})
如果满足以下所有条件,则会发生错误:
如果满足以下所有条件,也会发生错误:
错误消息:
与指定的按订单商品对应的索引路径被排除。
仅当使用CosmosDB时,该故障才会发生,并且在本机MongoDB(mongoDB Atlas,v4.0)中,其行为正确。
使用具有MongoDB 3.4有线协议(预览功能)的Azure Cosmos DB for MongoDB API。 MongoDB C#/。NET驱动程序和mongo shell均会出现问题。
此外,该问题仅发生在find()上。包含$ match和$ sort的等效聚合管道的行为正确。
在mongo shell中执行命令(或与mongoDB C#/。NET驱动程序等效的代码):
db.test.find({"field1": "value1"}).sort({"field2": 1})
所有符合查询条件的文档。如果没有,则不退还任何文件。
错误:错误:{ “ _t”:“ OKMongoResponse”, “ ok”:0, “代码”:2 “ errmsg”:“消息:{\”错误\“:[\”排除了与指定的按订单项对应的索引路径。“”]} \ r \ nActivityId:c50cc751-0000-0000-0000-000000000000,请求URI:/apps/[...]/,RequestStats:\ r \ nRequestStartTime:2019-07-11T08:58:48.9880813Z,RequestEndTime:2019-07-11T08:58:49.0081101Z,尝试的区域数:1 \ r \ nResponseTime:2019-07-11T08:58:49.0081101Z,StoreResult:StorePhysicalAddress:rntbd:// [...] /,LSN:359549,GlobalCommittedLsn:359548,PartitionKeyRangeId:0,IsValid:True,StatusCode:400 ,SubStatusCode:0,RequestCharge:1,ItemLSN:-1,SessionToken:-1#359549,UsingLocalLSN:True,TransportException:null,ResourceType:文档,OperationType:Query \ r \ n,SDK:Microsoft.Azure.Documents.Common /2.4.0.0“,[...]
在排序文档中添加其他“虚拟”字段可防止错误:
db.test.find({"field1": "value1"}).sort({"field2": 1, "dummyfield": 1}).count()
解决方法不令人满意。可能会伪造结果。
我是在做错什么,还是Cosmos DB在这里有缺陷?
答案 0 :(得分:4)
根据Microsoft的支持,需要在要排序的字段上创建索引。可以删除默认索引并创建自定义索引。至于每次添加新字段时都不会修改索引的问题,除了执行客户端排序之外,没有其他选择。不幸的是,客户端排序会占用客户端大量的CPU内存,而当您需要索引更多字段时,索引排序会起作用。
因此,我没有找到一个真正令人满意的解决方案:
答案 1 :(得分:0)
db.collection.createIndex ({ "$**" : 1 });