Я пытаюсь извлечь набор записей наиболее эффективным способом из 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;
этот НЕ использует индекс, но использует индекс, который состоит только из 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
}
);
Если я опускаю этап сортировки $, он использует мой вышеупомянутый индекс.
Я думал, что это возможно из-за того, что это агрегация, но этот «обычный» запрос также не использует индекс:
db.getCollection("cdr").find({
"account_id" : 160.0,
"cdr_block" : ObjectId("5d11e0364f853f15824aff47"),
"billing.total_billed" : {
"$gt" : 0.0
}
}).sort({"times.created" : -1 });