CosmosDB MongoDB 3.6失败了具有复合索引的sort()查询

时间:2019-12-16 23:32:58

标签: azure-cosmosdb-mongoapi

这里是Newby MongoDB和CosmosDB的用户,我已经阅读了How does MongoDB treat find().sort() queries with respect to single and compound indexes?这个问题的答案以及官方的MongoDB文档,并且我相信我的索引创建反映了这个答案,所以我倾向于这是CosmosDB问题,但请阅读他们的文档CosmosDB 3.6也支持复合索引,所以我现在很茫然。

我能够在创建索引为db.Videos.find().sort({"PublishedOn": 1})db.Videos.createIndex({"PublishedOn": 1})的集合上从mongo命令行运行诸如db.Videos.createIndex({"PublishedOn": -1})之类的sort()查询。

当我在这样的db.Videos.find({"IsPinned": false}).sort({"PublishedOn": 1})的查找中添加“ where”子句时,上述索引仍然有效。

但是现在我要避免查找文档,因此我删除了上面的单个字段索引,并创建了一个像db.Videos.createIndex({"IsPinned": 1, "PublishedOn": 1})db.Videos.createIndex({"PublishedOn": 1, "IsPinned": 1})这样的复合索引,但是现在查询总是失败,错误The index path corresponding to the specified order-by item is excluded.

这是CosmosDB的限制吗?还是索引中的“排序”不好?

1 个答案:

答案 0 :(得分:0)

CosmosDB的问题在于,它希望所有WHERE字段都以完全相同的顺序在GROUP BY子句中使用,否则它将不使用索引。

将索引创建为db.Videos.createIndex({"IsPinned": 1, "PublishedOn": 1}),然后将查询更新为db.Videos.find({"IsPinned": false}).sort({"IsPinned": 1, "PublishedOn": 1})就像是一种魅力。

我通过阅读有关索引策略(https://docs.microsoft.com/en-us/azure/cosmos-db/index-policy)的CosmosDB文档来推断出这一点,因为在创建索引(https://docs.microsoft.com/en-us/azure/cosmos-db/mongodb-indexing)部分之后MongoDB文档突然停止了。