mongodb - 查询的执行时间 - MongoDB

标签 mongodb mongodb-query

我有两个收藏:教练和团队。 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/

相关文章:

mongodb - Mongo 复合索引,在查询中使用 less-than-all

mongodb - 如何在 Mongo Shell CLI 中使用脚本

arrays - 如何增加数组mongodb下重复值的计数器

mongodb - 使用圆作为区域的地理查询以匹配 MongoDB 中 MultiPoint 对象的至少一个点

node.js - Mongoose 多个 $push 到多个数组

python - mongodb:查询列表中的值(而不是对象)

javascript - 返回特定的mongodb嵌入文档

mongodb - Ionic 框架应用程序离线工作并与 mongoDB 同步数据

javascript - Mongodb写顺序

c - 查询mongodb C