Mongodb查询依赖于同一文档

时间:2017-02-07 00:06:35

标签: mongodb mongodb-query

所以我试图在MongoDB中编写一个查询,该查询依赖于被查询的部分文档来返回我想要的文档。

这是这些文件格式的一个例子:

{
    "_id" : ObjectId("58990510cdab041b39c78dd1"),
    "classcode" : "CS433",
    "department" : "CS",
    "instructor" : {
            "name" : "Mike",
            "office" : "Starbucks"
    },
    "students" : [
            {
                    "name" : "Dave",
                    "major" : "CS",
                    "gradyear" : 2019
            },
            {
                    "name" : "Joe",
                    "major" : "CS",
                    "gradyear" : 2018
            },
            {
                    "name" : "Stan",
                    "major" : "CS",
                    "gradyear" : 2017
            }
    ]
}

我想使用表示部门的字符串来帮助查看主要部门是否与该部门不匹配。即如果该部门是CS,那么它会检查是否有一个学生没有CS作为他们的专业。

我知道$ne$elemMatch,还有什么不知道。我在使用文档的其他部分来帮助查询时遇到了麻烦。我不认为子查询会在这里使用。

1 个答案:

答案 0 :(得分:1)

您可以使用$redact

$redact一次浏览一个文档级别,并递归查找major字段,并根据$$DESCEND的条件执行$$PRUNE$$ROOT水平。

该查询将保留所有没有major匹配department的学生。

db.collection.aggregate([{
    "$redact": {
        "$cond": [{
                $ne: ["$major", "$$ROOT.department"]
            },
            "$$DESCEND",
            "$$PRUNE"
        ]
    }
}])

更新

如果至少有一位major的学生与department不匹配,此查询将返回所有文件。

db.collection.aggregate([
    { $redact: {
        $cond: {
            if: { "$ifNull" : ["$department", false] },
            then: { $cond: {
                if: { $anyElementTrue: {
                    $map: {
                        input: "$students",
                        as: "student",
                        in: { $ne: [ "$$student.major", "$$ROOT.department" ] }
                    }
                }},
                then: "$$DESCEND",
                else: "$$PRUNE"
            }},
            else: "$$DESCEND"
        }
    }}
])