Mat*_*ias 9 azure-cosmosdb azure-cosmosdb-mongoapi
使用 Cosmos DB for MongoDB API(版本 3.4),以下查找查询与方法游标排序的组合似乎行为不正确:
db.test.find({"field1": "value1"}).sort({"field2": 1})
Run Code Online (Sandbox Code Playgroud)
如果满足以下所有条件,则会发生错误:
如果满足以下所有条件,也会发生错误:
错误信息:
排除指定 order-by 项对应的索引路径。
该故障仅在使用 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})
Run Code Online (Sandbox Code Playgroud)
符合查询条件的所有文档。如果没有,则不应退回任何文件。
error: error: { "_t" : "OKMongoResponse", "ok" : 0, "code" : 2, "errmsg" : "Message: {\"Errors\":[\"指定顺序对应的索引路径-by 项目被排除。\"]}\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: ...]/, LSN: 359549, GlobalCommittedLsn: 359548, PartitionKeyRangeId: 0, IsValid: True, StatusCode: 400, SubStatusCode: 0, RequestCharge: 1, ItemLSN: -1, SessionToken: -1#359549, UsingLocalLSN: True传输异常:null,资源类型:文档,操作类型:查询\r\n,SDK:Microsoft.Azure.Documents.Common/2.4.0.0",[...]
向排序文档添加额外的“虚拟”字段可防止出现错误:
db.test.find({"field1": "value1"}).sort({"field2": 1, "dummyfield": 1}).count()
Run Code Online (Sandbox Code Playgroud)
解决方法并不令人满意。它可能会伪造结果。
我做错了什么,还是 Cosmos DB 在这里的行为有缺陷?
根据 Microsoft 支持,需要在被排序的字段上创建索引。可以删除默认索引并创建自定义索引。至于每次添加新字段时不修改索引的问题,除了执行客户端排序之外别无他法。不幸的是,客户端排序会在客户端占用大量 CPU 内存,并且当您获得更多要索引的字段时,索引排序将需要工作。
因此我没有找到一个真正令人满意的解决方案:
| 归档时间: |
|
| 查看次数: |
3074 次 |
| 最近记录: |