所以我试图在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
,还有什么不知道。我在使用文档的其他部分来帮助查询时遇到了麻烦。我不认为子查询会在这里使用。
答案 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"
}
}}
])