Mongo 3.2加入特定项目

时间:2016-02-13 05:35:46

标签: mongodb mongodb-query

想象一下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"}}])

1 个答案:

答案 0 :(得分:0)

该示例存在一些问题。

  1. 类中数组与student对象本身之间的类型不一样。您无法将字符串与ObjectId进行比较并期望获得所需的结果。
  2. $ lookup在两个字段上执行$ eq。在示例中,这意味着查找正在尝试比较:

    [" 13945647b27e7e65869aeb65"," 03945647b27e7e65029aeb65"] == ObjectId(" 13945647b27e7e65869aeb65")

  3. 由于上述两点,此查询将失败,最终将搜索所有文档。

    为了使用类侧的学生数组,您需要先修复数组以匹配类型,然后在执行查找之前必须先解开数组。这是一个例子:

    db.class.aggregate([ 
        {$match:{ "_id": ObjectId("23945647b27e7e652a9aeb65")}}, 
        {$unwind: "$students"},
        {$lookup: { from: "student", localField: "students", foreignField: "_id", as: "stuffFromRight"}} 
    ])
    

    根据上面的结果,您可以使用项目将其缩小为仅显示学生记录(如果您愿意),但也可能值得将课程和学生拉在一起,因为您可能还需要查询课程在输出中。