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

时间:2014-04-30 13:25:20

标签: java mongodb aggregation-framework

情况:地图缩小(聚合)后我收集了大量文件。集合中的文档如下所示:

/* 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()。explain()来验证使用了哪个索引?
  4. 最好是将这样的集合或其表现偏执狂指数?

  5. 回答摘要:

    • 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 个答案:

答案 0 :(得分:1)

首先,指数1和3可能值得研究。至于解释,您可以将解释作为选项传递给您的管道。您可以找到文档here和示例here