gpt4 book ai didi

java - Mongodb和Java : Create indexes for aggregation framework

转载 作者:太空宇宙 更新时间:2023-11-04 06:50:20 28 4
gpt4 key购买 nike

情况:我在 map 缩减(聚合)后收集了大量文档。集合中的文档如下所示:

/* 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. 对这样的集合建立索引是个好主意还是我的性能偏执?
<小时/>

答案摘要:

  • MongoDB 自动通过 _id 字段创建索引,但在复杂的 _id 字段(如示例中)的情况下,这是没有用的。对于像这样的字段:_id: {name: "", timestamp: ""} 您必须使用这样的索引:*.ensureIndex({"_id.name": 1, "_id.timestamp": 1}) 只有在您的集合将通过 _id 字段以正确的方式建立索引之后。
  • 要跟踪索引如何与 Mongo Aggregation 配合使用,您不能使用 db.myCollection.aggregate().explain() ,正确的方法是:

<p></p>

db.runCommand({
aggregate: "collection_name",
pipeline: [match, proj, group, sort, skip, limit],
explain: true
})
  • 我在本地计算机上的测试表明这种索引似乎是个好主意。但这是需要对大型集合进行更多测试

最佳答案

首先,索引 1 和 3 可能值得研究。至于解释,您可以将解释作为选项传递给管道。您可以找到文档 here和一个例子here

关于java - Mongodb和Java : Create indexes for aggregation framework,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23389363/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com