更正大型查询的mongo索引

时间:2014-09-19 17:28:08

标签: mongodb mongoose

我正在使用mongoose,并且有一个类似于此的架构:

var schema = new mongoose.Schema({
    created: Date,
    fieldA: ObjectId,
    fieldB: ObjectId,
    fieldC: ObjectId,
    sortField: Number
});

这是一个很大的集合,所以我想确保索引是最佳的。我建立了一个类似这样的查询:

var query = Schema.find({created: some-date-clause});
if ( some-condition )
    query = query.or({fieldA: {$in: listOfSomeFieldAIDs}});
if ( some-other-condition )
    query = query.or({fieldB: {$in: listOfSomeFieldBIDs}});
if ( yet-another-condition )
    query = query.or({fieldC: {$in: listOfSomeFieldCIDs}});

query = query.sort({sortField:-1});

我想确保无论查询是什么,它都完全覆盖了。我的直觉是创建一个跨越创建的索引,fieldA,fieldB,fieldC和sortField。但是,我是否应该为例如仅第二个条件为真,或者第一个和第三个条件为真的情况创建多个索引?我应该以不同的方式接近这个吗?

1 个答案:

答案 0 :(得分:1)

$or查询的每个子句都是独立考虑的,因此最好创建三个单独的索引,每个fieldAfieldB和{{1} }。请参阅文档here

在合并三个fieldC子句的结果后进行排序,因此向这些索引添加$or并不是很有用。

但与往常一样,使用explain()验证任何索引方法,以确保您的查询能够使用您已创建的索引。