情况:在map reduce(聚合(之后,我收集了大量文档。集合中的文档如下所示:
/* 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字段的对象创建索引
- 如何模拟db.collection.find((.deexplain((来验证使用了哪个索引
- 索引这样的收藏是个好主意还是我的表现偏执狂
答案汇总:
- MongoDB通过
_id
字段自动创建索引,但在像示例中那样的复杂_id
字段的情况下,这是无用的。对于像_id: {name: "", timestamp: ""}
这样的字段,您必须使用像*.ensureIndex({"_id.name": 1, "_id.timestamp": 1})
这样的索引,然后您的集合将以正确的方式由_id
字段进行索引 - 为了跟踪您的索引如何使用Mongo Aggregation,您不能使用
db.myCollection.aggregate().explain()
,正确的方法是:
db.runCommand({
aggregate: "collection_name",
pipeline: [match, proj, group, sort, skip, limit],
explain: true
})
- 我在本地计算机上的测试表明,这样的索引似乎是个好主意。但这是需要更多的测试与大集合
首先,索引1和3可能值得研究。至于explain,您可以将explain作为一个选项传递给您的管道。您可以在此处找到文档,并在此处找到示例