У меня есть коллекция Mongo, содержащая миллионы документов в следующем формате:
{
"_id" : ObjectId("5ac37fa989e00723fc4c7746"),
"group-number" : NumberLong(128125089),
"date" : ISODate("2018-04-03T13:20:41.193Z")
}
И я хочу получить документы между 2 датами (' date '), отсортированными по ' группа-Numbe г».Итак, я выполняю запросы такого типа:
db.getCollection('group').find({date:{$gt:new Date(1491372960000),$lt:new Date(1553152560000)}}).sort({"group-number":1})
В соответствии с https://blog.mlab.com/2012/06/cardinal-ins/ кажется, что MongoDB при запросах не по эквивалентным значениям, но с range значений (как в моем случае), лучше иметь индекс в обратном порядке (сначала отсортированное поле / затем отфильтрованное поле).Действительно, у меня были лучшие результаты с индексом db.group.createIndex({"group-number":1,"date":1});
.Но все же это занимает слишком много времени;в тех же случаях более 40 секунд.
Согласно результатам объяснение () , действительно используется вышеуказанный индекс.
"winningPlan" : {
"stage" : "FETCH",
"filter" : {
"$and" : [
{
"date" : {
"$lt" : ISODate("2019-03-21T07:16:00.000Z")
}
},
{
"date" : {
"$gt" : ISODate("2017-04-05T06:16:00.000Z")
}
}
]
},
"inputStage" : {
"stage" : "IXSCAN",
"keyPattern" : {
"group-number" : 1.0,
"date" : 1.0
},
"indexName" : "group-number_1_date_1",
"isMultiKey" : false,
"multiKeyPaths" : {
"group-number" : [],
"date" : []
},
"isUnique" : false,
"isSparse" : false,
"isPartial" : false,
"indexVersion" : 2,
"direction" : "forward",
"indexBounds" : {
"group-number" : [
"[MinKey, MaxKey]"
],
"date" : [
"[MinKey, MaxKey]"
]
}
}
}
Как улучшитьспектакль?Должно быть, я что-то упустил ...