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