我有两个收藏:教练和团队。 Coach 集合包含有关教练的信息,如姓名、年龄和数组 coached_Team,其中包含教练所执教的球队的 _id。 团队集合包含有关团队的数据,例如_id、常用名、官方名称、国家/地区、冠军...... 例如,如果我想查找阿莱格里执教的所有球队的官方名称,我必须执行两个查询,第一个查询是教练集合:
>var x = db.coach.find({surname:"Allegri"},{_id:0, "coached_Team.team_id":1})
>var AllegriTeams
>while(x.hasNext()) AllegriTeams=x.next()
{
"coached_Team" : [
{
"team_id" : "Juv.26
},
{
"team_id" : "Mil.74
},
{
"team_id" : "Cag.00
}
]
}
>AllegriTeams=AllegriTeams.coached_Team
[
{
"team_id" : "Juv.26"
},
{
"team_id" : "Mil.74"
},
{
"team_id" : "Cag.00"
}
]
然后我必须对团队集合执行三个查询:
> db.team.find({ _id:AllegriTeams[0].team_id}, {official_name:1,_id:0})
{official_name : "Juventus Football Club S.p.A."}
> db.team.find({ _id:AllegriTeams[1].team_id}, {official_name:1,_id:0})
{official_name : "Associazione Calcio Milan S.p.A"}
> db.team.find({ _id:AllegriTeams[2].team_id}, {official_name:1,_id:0})
{official_name:"Cagliari Calcio S.p.A"}
现在考虑一下我有大约 10 万份关于催收团队和催收教练的文档。第一个查询是关于 coach 集合的,加上 while 循环的时间大约需要 71 毫秒。使用cursor.explain("executionStats") 对团队集合进行三个查询需要0 毫秒。我不明白为什么这个查询需要0。 我需要这三个查询的executionTimeMillis 来获得查询“查找阿莱格里执教的所有球队的官方名称”的执行时间。我想将 Coach 集合上的查询的执行时间(71ms)与这三个的执行时间相加。如果这三个查询的时间都是0,我主要可以说查询的执行时间是什么?
最佳答案
我认为这里更重要的观察是,71 毫秒对于简单地获取一个项目来说是很长的时间。看起来您的“姓氏”字段需要一个索引。其他“三个”查询是主键的简单查找,这就是它们相对较快的原因。
db.coach.createIndex({ "surname": 1 })
如果该姓氏实际上是“唯一的”,那么也添加它:
db.coach.createIndex({ "surname": 1 },{ "unique": true })
您还可以通过简单地映射数组并应用$in
来将“三个”查询简化为一个查询。运算符:
var teamIds = [];
db.coach.find(
{ "surname": "Allegri" },
{ "_id":0, "coached_Team.team_id":1 }
).forEach(function(coach) {
teamIds = coach.coached_Team.map(function(team) {
return team.team_id }).concat(teamIds);
});
});
db.team.find(
{ "_id": { "$in": teamIds" }},
{ "official_name": 1, "_id": 0 }
).forEach(function(team) {
printjson(team);
});
当然,总体执行时间会大大缩短,并且将多个操作的开销减少到只需要两个查询。
这里还要记住,无论执行计划统计信息如何,向服务器发出或从服务器发出的查询越多,发出每个请求和检索数据的总体实时执行时间就越长。所以最好让事情尽可能少。
因此,更合乎逻辑的是,在哪里定期“需要”此信息,将“教练姓名”存储在“团队本身”上(并为该数据建立索引)会导致最快的响应,并且只需一次查询操作。
很容易陷入观察执行统计数据的困境。但实际上,请考虑什么是“最佳”和“最快”作为您想要执行的查询类型的模式。
关于mongodb - 查询的执行时间 - MongoDB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32033453/