MongoDB使用$lookup、$unwind、$match进行搜索
在我的mongodb中有两个集合,分别命名为“教师”和“课程”,其结构如下所示 老师MongoDB使用$lookup、$unwind、$match进行搜索,mongodb,aggregation-framework,Mongodb,Aggregation Framework,在我的mongodb中有两个集合,分别命名为“教师”和“课程”,其结构如下所示 老师 { “评级”:4, “教师id”:“123”, “课程计数”:1, }, { “评级”:5, “教师id”:“456”, “课程计数”:4, } 课程 { “教师id”:“123”, "先进":是的,, }, { “教师id”:“456”, "先进":假,, } 我想搜索的是哪门课程的老师教的课程少于2门,而这门课程的进阶是正确的 我想要的结果 { “教师id”:“123”, "先进":是的,, } 我试
{
“评级”:4,
“教师id”:“123”,
“课程计数”:1,
},
{
“评级”:5,
“教师id”:“456”,
“课程计数”:4,
}
课程
{
“教师id”:“123”,
"先进":是的,,
},
{
“教师id”:“456”,
"先进":假,,
}
我想搜索的是哪门课程的老师教的课程少于2门,而这门课程的进阶是正确的
我想要的结果
{
“教师id”:“123”,
"先进":是的,,
}
我试过了
db.getCollection('course').aggregate([
{“$limit”:10},
{“$lookup”:{
“localField”:“教师id”,
“from”:“teacher”,
“外域”:“教师id”,
“作为”:“教师”
}},
{“$unwind”:{path:'$teacher',preserveNullandmptyarray:true},
{$match':{
"先进":对,,
'教师.课程计数':{'$lt':2}
}}
])
但是好像不行,有人能帮我吗?谢谢 试试这个:
db.course.aggregate([
{
"$match": {
"advanced": true
}
},
{
"$lookup": {
"from": "teacher",
"localField": "teacher_id",
"foreignField": "teacher_id",
"as": "teacher"
}
},
{
"$match": {
"teacher.course_count": {
"$lt": 2
}
}
},
{
"$project": {
"_id": 0,
"advanced": 1,
"teacher_id": 1
}
},
{
"$limit": 10
}
])
注意:如果需要访问
教师
数组内容,可以使用$unwind
+$project
或$let
操作符。如果此解决方案满足您的要求,请告知我您可能会发现,在教师集合中进行汇总、查找相应的课程、删除任何教授0门或2门以上课程的课程,然后删除任何教授非高级课程的课程更为简单。这应该在教师和课程之间留下一个1:1的映射。它在MongoPlayground上使用了我的少量真实数据,但在我的真实数据库上不起作用。根据我的大型数据库,查询似乎是超时的。我仍在寻找其他方法来处理我的问题。您知道其他解决方案吗(不限制$lookup和$unwind都可以),谢谢您的帮助!