想象一下Mongo 3.2中的两个集合叫做学生和班级。什么是返回特定类中所有学生文档的查询。
带有$ lookup的聚合似乎想要对集合中的所有文档进行操作。例如,返回每个班级的所有学生而不是特定班级。
如何申请id = 23945647b27e7e652a9aeb65的特定班级的学生成绩?
类别:
{
"_id" : ObjectId("23945647b27e7e652a9aeb65"), // Given this
"name" : "Algebra",
"students" : [ "13945647b27e7e65869aeb65", "03945647b27e7e65029aeb65" ]
}
学生://返回此
{
"_id" : ObjectId("13945647b27e7e65869aeb65"),
"name" : "foo"
}
{
"_id" : ObjectId("03945647b27e7e65029aeb65"),
"name" : "bar"
}
一些失败的尝试:
db.student.aggregate([{$match:{"$ref": "class", "_id": ObjectId("23945647b27e7e652a9aeb65")}},{$lookup:{from: "class",localField:"students",foreignField: "_id", as: "stuffFromRight"}}}])
db.student.aggregate([{$lookup:{from: {"$ref": "class", "_id": ObjectId("23945647b27e7e652a9aeb65")},localField:"students",foreignField: "_id", as: "stuffFromRight"}}])
这个获得PARTIAL信用,因为它确实进行了正确的查找。但是,......,它并没有将结果限制在我想要的特定类别。
db.student.aggregate([{$lookup:{from: "class",localField:"students",foreignField: "_id", as: "stuffFromRight"}}])
答案 0 :(得分:0)
该示例存在一些问题。
$ lookup在两个字段上执行$ eq。在示例中,这意味着查找正在尝试比较:
[" 13945647b27e7e65869aeb65"," 03945647b27e7e65029aeb65"] == ObjectId(" 13945647b27e7e65869aeb65")
由于上述两点,此查询将失败,最终将搜索所有文档。
为了使用类侧的学生数组,您需要先修复数组以匹配类型,然后在执行查找之前必须先解开数组。这是一个例子:
db.class.aggregate([
{$match:{ "_id": ObjectId("23945647b27e7e652a9aeb65")}},
{$unwind: "$students"},
{$lookup: { from: "student", localField: "students", foreignField: "_id", as: "stuffFromRight"}}
])
根据上面的结果,您可以使用项目将其缩小为仅显示学生记录(如果您愿意),但也可能值得将课程和学生拉在一起,因为您可能还需要查询课程在输出中。