MongoDB分组任务 - 多个组,条件

时间:2016-12-26 17:15:53

标签: mongodb aggregation-framework pymongo

我的目标是让所有学生'#39;属于'类的文档' 至少有一个年级的学生"蓝色"至少有一个 等级"红色"。

我倾向于简单地在Python(pymongo)中执行一系列查询,直接处理任务。

我想知道是否有一些我可以使用的聪明的聚合管道!

假设:

课程集合:

{ class_id: 'a' }
{ class_id: 'b' }

学生收藏:

{ class_id: 'a',
grade: 'blue' }

{class_id: 'a',
grade: 'red' }

1 个答案:

答案 0 :(得分:0)

您可以使用:

  • $groupclass_id分组$pushblue数组中的所有成绩,以便我们可以在下一步中轻松推断出哪个类“包含”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>