У меня есть MongoDB колпачка коллекция со следующими показателями:естественный порядок с фильтром на MongoDB ограничена коллекция
[
{
"v" : 1,
"key" : {
"_id" : 1
},
"name" : "_id_",
"ns" : "events.messageIn"
},
{
"v" : 1,
"key" : {
"uuid" : 1,
"ts" : -1
},
"name" : "uuid_1_ts_-1",
"ns" : "events.messageIn",
"background" : true
}
]
Как вы можете сделать вывод, что это сбор данных о событиях. Поскольку временные метки всегда увеличиваются, заказ {$natural: -1}
должен быть эквивалентным заказу {ts: -1}
. Я между прочим добавил индекс по ts
, чтобы быть в состоянии сделать эффективные запросы для временных срезов (например db.messageIn.find({ts: {$gte: ISODate("2016-08-01")}})
Однако, я (возможно, наивно) ожидать, что логический вопрос «дают мне самые последние сообщения SOME_UUID в» будет наиболее эффективно ответить db.messageIn.find({uuid: SOME_UUID}).sort({$natural: -1})
. Как это, что запрос представляет собой набор сканирование порядков медленнее, чем план для db.event.find({uuid: SOME_UUID}).sort({ts: -1})
.
Почему именно это? Спекулятивно, я предполагаю, что это потому, что MongoDB считает, что после того, как он смотрит на index, он не сможет обеспечить естественный порядок, в результате он регрессирует к сканированию коллекции. Не может ли MongoDB немного поучаствовать в этом вопросе? Например, чтобы использовать анал гия индекса книги в:
uuid ts page
abcdef 2016-06-01T00:03 10
abcdef 2016-06-01T00:02 8
abcdef 2016-06-01T00:01 6
ghijkl 2016-06-01T00:03 9
mnopqr 2016-06-01T00:02 7
mnopqr 2016-06-01T00:01 5
После фильтрации по uuid
, вы можете достаточно легко упорядочить по странице; нет необходимости посещать каждую страницу по порядку, проверять ее uuid и выводить страницу, если она соответствует. Ссылки на страницы «MongoDB» как-то не упорядочены? Понятно, что моя ментальная модель никуда не денется.