Mongodb 交替mongo聚合查询

Mongodb 交替mongo聚合查询,mongodb,indexing,aggregation-framework,Mongodb,Indexing,Aggregation Framework,我有一个聚合mongodb查询 db.collection.aggregate([ {$match: {a: "a1", b: "b1"}},{$group: {...}}, {$sort: {...}}, {$limit: {10}} ]) 我在a和b上有一个复合索引,查询速度很快 但是当我把比赛改成 $match: {$or: [{a: "a1", b: "b1"}, {a: "a2", b: "b2"}]} 查询变得相当慢,而且似乎没有使用任何索引 有没有办法1)重

我有一个聚合mongodb查询

db.collection.aggregate([
    {$match: {a: "a1", b: "b1"}},{$group: {...}}, 
    {$sort: {...}}, {$limit: {10}}
])
我在a和b上有一个复合索引,查询速度很快

但是当我把比赛改成

 $match: {$or: [{a: "a1", b: "b1"}, {a: "a2", b: "b2"}]}
查询变得相当慢,而且似乎没有使用任何索引


有没有办法1)重写查询以使用复合索引(作为单个查询)或2)强制它使用索引?

我会尝试在聚合的开头添加一个排序步骤,看看它是否强制使用索引

db.collection.aggregate([
    {$sort: {a:1, b:1}},
    {$match: {$or: [{a: "a1", b: "b1"}, {a: "a2", b: "b2"}]}},
    ...
])

如果您定义了db.coll.createIndex({a:1,b:1}),您的查询将正确地使用复合索引,我认为是这样,但这不是解释告诉我的。它没有将索引与$or一起使用,但它没有。您是否可以发布
解释查询结果并修改代码以包含您执行
排序操作的字段。因为有人问我这个问题,我可以说,在一个简单的测试中,我没有看到超过1000000次操作的降级,所以看到结果大小会很有趣。确实,聚合中的“解释”计划没有明确说明使用了索引。但是,我没有看到性能下降,表明它没有被使用。所以对我来说它相当快。在不让我们拖网代码的情况下,您可以针对您的问题发布一些度量标准吗?您使用的是哪个特定版本的MongoDB服务器?您是否还可以包括
db.collection.find(…).explain(true)
的输出,以便我们可以查看您的
$或
查询所考虑的查询计划?虽然将$sort放置在管道的开头可能会影响所选索引,但这肯定不是您想要的结果。聚合管道只能够在第一个阶段访问索引,因此任何后续阶段都不能使用索引,并且使用索引边界的好处也将丢失
$match
几乎总是任何聚合管道的第一阶段。@Neil Lunn,很高兴了解索引和$match,但是为什么问题中的索引不能正常工作?@Disposer真的不知道,并且可能会拖网搜索代码tom morrow来找出原因。这不是解决问题的方法,这就是我所标记的全部。@NeilLunn在MongoDB 2.6中有一个问题,因此如果这是管道中的前两个操作,那么订单可能没有意义。需要知道服务器版本和候选索引以缩小答案的范围;)@Stennie虽然作为优化被“列出”,但它只将
$match
移动到
$sort
之前,因此实际上是一个“代码更正”,回到了我刚才提到的要点。至于服务器版本,OP引用了“但这不是解释告诉我的”,所以说2.6.x是合理的,尽管我相信解释选项出现在2.4.9中,但没有记录。所以我不认为大多数人都试过更早的版本。但这可能是错误的。