Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
查询的执行时间-MongoDB_Mongodb_Mongodb Query - Fatal编程技术网

查询的执行时间-MongoDB

查询的执行时间-MongoDB,mongodb,mongodb-query,Mongodb,Mongodb Query,我有两个系列:教练系列和团队系列。 Coach collection包含有关教练的信息,如姓名、姓氏、年龄和教练指导的团队数组,该数组包含教练指导的团队的\u id。 团队集合包含有关团队的数据,如\u id、通用名称、官方名称、国家、冠军。。。。 例如,如果我想找到由Allegri执教的所有球队的官方名称,我必须做两个查询,第一个是关于coach collection的查询: >var x = db.coach.find({surname:"Allegri"},{_id:0, "coac

我有两个系列:教练系列和团队系列。 Coach collection包含有关教练的信息,如姓名、姓氏、年龄和教练指导的团队数组,该数组包含教练指导的团队的\u id。 团队集合包含有关团队的数据,如\u id、通用名称、官方名称、国家、冠军。。。。 例如,如果我想找到由Allegri执教的所有球队的官方名称,我必须做两个查询,第一个是关于coach collection的查询:

>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"}
然后我必须对团队集合执行三个查询:

>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"}
现在我认为我在收集队和收集教练方面有大约100K的文件。第一个查询是coach collection,需要大约71毫秒加上while循环时间。使用cursor.explain(“executionStats”)对团队集合进行的三次查询需要0毫秒。我不明白为什么此查询需要0毫秒。
我需要这三个查询的executionTimeMillis,以获得查询“查找Allegri指导的所有团队的正式名称”的执行时间。我想将coach集合上查询的执行时间(71ms)与这三个集合的执行时间相加。如果这三个查询的时间是0,那么我主要可以说查询的执行时间是多少?

我认为这里更重要的观察是,对于一个项目的简单获取来说,71ms是一个很长的时间。看起来您的“姓氏”字段需要索引。其他“三个”查询是主键的简单查找,这就是它们相对较快的原因

db.coach.createIndex({“姓氏”:1})
如果该姓氏实际上是“唯一的”,那么也要加上:

db.coach.createIndex({“姓氏”:1},{“唯一”:true})
您还可以通过简单地映射数组并应用运算符将“三个”查询简化为一个查询:

var teamIds=[];
db.coach.find(
{“姓氏”:“阿莱格里”},
{“\u id”:0,“指导团队。团队\u id”:1}
).forEach(功能(coach){
teamIds=教练、教练和团队地图(功能(团队){
return team.team_id}).concat(teamid);
});
});
db.team.find(
{u id:{“$in”:teamIds},
{“官方名称”:1,“\u id”:0}
).forEach(职能(团队){
printjson(团队);
});
当然,总体执行时间大大缩短了,而且将多个操作的开销减少到只需要两个查询

这里还要记住,不管执行计划统计数据中有什么,向服务器发出的查询越多,发出每个请求和检索数据的总实时执行时间就越长。因此,最好尽可能将事情最小化

因此,更符合逻辑的是,在哪里定期“需要”这些信息,将“教练姓名”存储在“团队本身”(并对该数据进行索引)将导致尽可能快的响应,并且只需要一次查询操作


观察执行数据很容易,但实际上,想想什么是“最好的”和“最快的”“作为您想要执行的查询类型的一种模式。

回答得非常好。非常感谢。还有一件事。当我在字段上创建索引时,该字段上查询的
executionTimeMillis
为0是否正常?也许这取决于收集团队中文档数量少(100k)。如果我添加100万而不是10万个文档,那么创建索引后的executionTimeMillis会有所不同?@DistributioneGaussiana它“取决于”很多事情。一般来说,“索引”应该比您的总体数据小得多。因此,任何数据库都“努力”将索引数据“先”保存在内存中,然后再保存实际集合的其他工作数据。因此,搜索时间至少应该是最佳的,而其他“分页”信息通常会被使用。这是“正常”吗?这要视情况而定,但这是“可取的”吗?那当然。