MongoDB ESR索引规则-范围过滤和排序

1hdlvixo  于 2023-06-29  发布在  Go
关注(0)|答案(2)|浏览(135)

以下关于范围过滤器和排序以及 predicate 必须放置的方式的语句令人困惑。
MongoDB无法对范围过滤器的结果进行索引排序。将范围过滤器放在排序 predicate 之后,这样MongoDB就可以使用非阻塞索引排序。
我们如何在下面这样的mongo查询中的排序 predicate 之后放置一个过滤器
db.collectionName.find({}).sort(sortField:1);
https://www.mongodb.com/docs/upcoming/tutorial/equality-sort-range-rule/#range

zqdjd7g9

zqdjd7g91#

我想你可能误解了“安置”指的是什么。
ESR指南是关于如何定义索引本身,特别是应该以什么顺序列出键。它与重新排列查询本身中的任何内容无关。事实上,你不能做这样的事情

.find({}).sort({sortField:1}).find({rangeCondition:{$gte:1}})

相反,您的查询可能看起来像这样:

.find({rangeCondition:{$gte:1}}).sort({sortField:1})

因此,您可以将索引创建为:

.createIndex({sortField:1, rangeCondition:1})

这与创建字段反转的索引相反,例如.createIndex({rangeCondition:1, sortField:1 })
还要注意,这只是提供了一般性指导,并不适用于所有情况。如果您的范围 predicate 具有足够的选择性,那么您可以通过使用索引引导该字段来获得更好的结果。

3htmauhk

3htmauhk2#

您可以使用聚合框架:

  • 使用$sort stage根据所需的字段对文档进行排序。
  • 使用$match stage在排序后应用筛选器。下面是一个使用聚合框架的示例:
db.collectionName.aggregate([
  { $sort: { sortField: 1 } }, // Sort the documents based on sortField
  { $match: { /* Your filter criteria */ } } // Apply the filter after sorting
]);

相关问题