我的目标是让所有学生'#39;属于'类的文档' 至少有一个年级的学生"蓝色"至少有一个 等级"红色"。
我倾向于简单地在Python(pymongo)中执行一系列查询,直接处理任务。
我想知道是否有一些我可以使用的聪明的聚合管道!
假设:
课程集合:
{ class_id: 'a' }
{ class_id: 'b' }
学生收藏:
{ class_id: 'a',
grade: 'blue' }
{class_id: 'a',
grade: 'red' }
答案 0 :(得分:0)
您可以使用:
$group
按class_id
分组$push
和blue
数组中的所有成绩,以便我们可以在下一步中轻松推断出哪个类“包含”class_id
。使用$$ROOT
保留当前文档,因为我们需要符合$match
blue
仅匹配其中包含成绩为$unwind
的班级
$$ROOT
删除之前$project
生成的学生数组
db.students.aggregate([{
"$group": {
"_id": "$class_id",
"grades": { "$push": "$grade" },
"students": { "$push": "$$ROOT" }
}
}, {
"$match": {
"grades": { "$all": ["blue","red"] }
}
}, {
"$unwind": "$students"
}, {
"$project": {
"_id": "$students._id",
"class_id": "$students.class_id",
"grade": "$students.grade",
}
}])
可以很好地重新整理您的文档
查询将是:
$match
如果您需要匹配[“蓝色”,“红色”]以外的其他颜色,您可以在$in: ["blue","red","yellow"]
聚合(from pymongo import MongoClient
import pprint
db = MongoClient().testDB
pipeline = [ <the_aggregation_query_here> ]
pprint.pprint(list(db.students.aggregate(pipeline)))
)
为了在PyMongo中实现它,它非常简单:
classes
另外,要仅匹配属于{
$lookup: {
from: "classes",
localField: "class_id",
foreignField: "class_id",
as: "class"
}
}, {
$match: {
"class": { $not: { $size: 0 } }
}
}
集合的学生,请执行$lookup
并匹配非空的学生。在聚合查询中添加以下内容:
<textarea id="code"></textarea>