情况:地图缩小(聚合)后我收集了大量文件。集合中的文档如下所示:
/* 0 */
{
"_id" : {
"appId" : ObjectId("1"),
"timestamp" : ISODate("2014-04-12T00:00:00.000Z"),
"name" : "GameApp",
"user" : "test@mail.com",
"type" : "game"
},
"value" : {
"count" : 2
}
}
/* 1 */
{
"_id" : {
"appId" : ObjectId("2"),
"timestamp" : ISODate("2014-04-29T00:00:00.000Z"),
"name" : "ScannerApp",
"user" : "newUser@company.com",
"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
})