Mongo和Java:为聚合框架创建索引



情况:在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}

我得到了正确的结果,这正是我所需要的。但从优化的角度来看,我对索引有疑问。

问题:

  1. 是否可以为这样的集合创建索引
  2. 如何为具有复杂_id字段的对象创建索引
  3. 如何模拟db.collection.find((.deexplain((来验证使用了哪个索引
  4. 索引这样的收藏是个好主意还是我的表现偏执狂

答案汇总:

  • 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作为一个选项传递给您的管道。您可以在此处找到文档,并在此处找到示例

相关内容

  • 没有找到相关文章

最新更新