【发布时间】:2019-07-02 12:55:36
【问题描述】:
我正在尝试以最有效的方式从 MongoDB 获取一组记录,但是当我向管道添加排序阶段时它出错了。服务器没有使用我想要的索引。然而,根据文档,它应该匹配前缀: https://docs.mongodb.com/manual/tutorial/sort-results-with-indexes/#sort-and-non-prefix-subset-of-an-index
我有一个如下所示的索引:
{
"v" : 2,
"key" : {
"account_id" : 1,
"cdr_block" : 1,
"billing.total_billed" : 1,
"times.created" : -1
},
"name" : "IDX_by_account_and_block_sorted"
}
所以我假设当我过滤account_id、cdr_block 和billing.total_billed,然后对times.created 进行排序时,将使用索引。
但事实并非如此;当我在 MongoDB shell 中检查查询解释时;
这个不使用索引,而是使用一个只由times.created组成的索引,所以需要几分钟:
db.getCollection("cdr").aggregate(
[
{
"$match" : {
"account_id" : 160.0,
"cdr_block" : ObjectId("5d11e0364f853f15824aff47"),
"billing.total_billed" : {
"$gt" : 0.0
}
}
},
{
"$sort" : {
"times.created" : -1.0
}
}
],
{
"allowDiskUse" : true
}
);
如果我省略了 $sort 阶段,它确实会使用我上面提到的索引。
我在想这可能是因为它是一个聚合,但是这个“常规”查询也不使用索引:
db.getCollection("cdr").find({
"account_id" : 160.0,
"cdr_block" : ObjectId("5d11e0364f853f15824aff47"),
"billing.total_billed" : {
"$gt" : 0.0
}
}).sort({"times.created" : -1 });
【问题讨论】: