Ситуация: у меня есть коллекция с огромным количеством документов после сокращения карты (агрегация). Документы в коллекции выглядят следующим образом:
/* 0 */
{
"_id" : {
"appId" : ObjectId("1"),
"timestamp" : ISODate("2014-04-12T00:00:00.000Z"),
"name" : "GameApp",
"user" : "[email protected]",
"type" : "game"
},
"value" : {
"count" : 2
}
}
/* 1 */
{
"_id" : {
"appId" : ObjectId("2"),
"timestamp" : ISODate("2014-04-29T00:00:00.000Z"),
"name" : "ScannerApp",
"user" : "[email protected]",
"type" : "game"
},
"value" : {
"count" : 5
}
}
...
И я ищу в этой коллекции с помощью структуры агрегации:
db.myCollection.aggregate([match, project, group, sort, skip, limit]); // aggregation can return result on Daily or Monthly time base depends of user search criteria, with pagination etc...
Возможные критерии поиска:
1. {appId, timestamp, name, user, type}
2. {appId, timestamp}
3. {name, user}
Я получаю правильный результат, именно то, что мне нужно. Но с оптимистической точки зрения у меня есть сомнения в индексировании.
Вопросов:
Подведение итогов:
_id
но это бесполезно в случае сложного поля _id
как в примере. Для поля типа: _id: {name: "", timestamp: ""}
вы должны использовать индекс следующим образом: *.ensureIndex({"_id.name": 1, "_id.timestamp": 1})
только после этого коллекция будет правильно проиндексирована полем _id
.db.myCollection.aggregate().explain()
и правильный способ сделать это:
db.runCommand({
aggregate: "collection_name",
pipeline: [match, proj, group, sort, skip, limit],
explain: true
})
Во-первых, индексы 1 и 3, вероятно, стоит исследовать. Что касается объяснения, вы можете передать объяснение в качестве опции для вашего конвейера. Вы можете найти документы здесь и пример здесь