Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.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_Aggregation Framework_Pymongo - Fatal编程技术网

如何根据mongodb中另一个集合的公共字段值查找文档

如何根据mongodb中另一个集合的公共字段值查找文档,mongodb,mongodb-query,aggregation-framework,pymongo,Mongodb,Mongodb Query,Aggregation Framework,Pymongo,假设我有两个集合: 学生: 学校等级:(所有学校等级存储在一个文档中) 现在,我的问题是,我怎样才能找到学校排名高于3的学生。(我是mongodb的新手。看起来我需要使用查找功能,但我不知道如何准确地使用。)提前谢谢 您需要使用。类似于SQL中的“连接” 但是,首先。您的文档可能会更好schoolRank集合可以在文档中包含每个学校,而不是包含所有值的唯一数组 在这里检查使用的查询与拆分为schoolRank的模式之间的差异 第二个查询只返回字段school匹配的文档。另一个将返回每个文档的整个

假设我有两个集合: 学生:

学校等级:(所有学校等级存储在一个文档中)

现在,我的问题是,我怎样才能找到学校排名高于3的学生。(我是mongodb的新手。看起来我需要使用查找功能,但我不知道如何准确地使用。)提前谢谢

您需要使用。类似于SQL中的“连接”

但是,首先。您的文档可能会更好
schoolRank
集合可以在文档中包含每个学校,而不是包含所有值的唯一数组

在这里检查使用的查询与拆分为
schoolRank
的模式之间的差异

第二个查询只返回字段
school
匹配的文档。另一个将返回每个文档的整个数组,因为在每个文档中都存在一个字段
school
,该字段也存在于
rank
数组中

因此,对于您的模式,您需要额外的阶段。也许还有另一种更有效的方法,但我不习惯用糟糕的模式进行
$lookup
(抱歉)

我尝试了以下查询:

首先,
$lookup
连接两个集合(正如我前面所说,连接基本上是将整个数组添加到每个文档中)

然后是一个额外的阶段,使用
$set
将元素放在第一个位置,获取从
$lookup
返回的值

之后,使用
$project
te查询可以过滤字段
rank_school
并覆盖它,以仅获取字段
school
student.school
相同的元素

请注意,可以使用另一个模式省略上述步骤

然后,在
$project
之后,有一个
$match
阶段来获取
等级学校值大于或等于3的文档

最后一个阶段是另一个
$project
,删除字段
rank\u school

以下是查询:

db.student.aggregate([
{
“$lookup”:{
“from”:“schoolRank”,
“localField”:“school”,
“外域”:“等级学校”,
“as”:“rank_学校”
}
},
{
“$set”:{“rank_school”:{“$arrayElemAt”:[“$rank_school”,0]}
},
{
“$project”:{
“\u id”:“$\u id”,
“名称”:“$name”,
“学校”:“$school”,
“rank_学校”:{
“$filter”:{
“输入”:“$rank_school.rank”,
“as”:“排名学校过滤器”,
“cond”:{“$eq”:[“$$rank\u school\u filter.school”,“$school”]
}
}
}
},
{
“$match”:{“rank_school.value”:{“$gte”:3}
},
{
“$project”:{“rank_学校”:0}
}
])
例如

输出为:

[
{
“_id”:ObjectId(“5A934E0001020030405000003”),
“姓名”:“迈克”,
“学校”:“C”
},
{
“_id”:ObjectId(“5A934E0001020030405000004”),
“姓名”:“汤姆”,
“学校”:“D”
}
]

不客气!此外,如果问题已得到解决,则将答案标记为“接受”。
{name: Joe, school: A}
{name: Kelly, school: B}
{name: Mike, school: C}
{name: Tom, school: D}
{rank: [{school: A, value: 1},{school: B, value: 2},{school: C, value: 3},{school: D, value: 4}]}