【发布时间】:2015-03-20 09:35:39
【问题描述】:
我有一个聚合的 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.coll.createIndex({a : 1, b: 1}) ,您的查询将正确使用复合索引
-
我是这么认为的,但这不是它告诉我的解释。它没有使用带有 $or 的索引,但它没有使用。
-
您能否发布
explain查询结果并修改您的代码以包含您执行sort操作的字段。 -
因为有人问我这个问题,我可以说在一个简单的测试中我没有看到超过 1,000,000 次操作的降级,所以看看结果大小会很有趣。确实,从聚合中“解释”的计划并没有明确说明使用了索引。但是,我没有看到性能下降表明它没有被使用。所以对我来说它很快。在不让我们搜索代码的情况下,您能否发布一些指标来说明您在问题中的差异?
-
您使用的是哪个特定版本的 MongoDB 服务器?您能否还包括
db.collection.find(...).explain(true)的输出,以便我们可以看到为您的$or查询考虑的查询计划?
标签: mongodb indexing aggregation-framework