mongodb的修订对我来说似乎很模糊
我现在正在和修订作斗争,我不确定是否理解它 我刚刚阅读了文档,并尝试在一个集合等级上使用redact(它来自mongodb在线培训) 集合“grades”中的文档如下所示:mongodb的修订对我来说似乎很模糊,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我现在正在和修订作斗争,我不确定是否理解它 我刚刚阅读了文档,并尝试在一个集合等级上使用redact(它来自mongodb在线培训) 集合“grades”中的文档如下所示: { "_id" : ObjectId("50b59cd75bed76f46522c34e"), "student_id" : 0, "class_id" : 2, "scores" : [ { "type" : "exam",
{
"_id" : ObjectId("50b59cd75bed76f46522c34e"),
"student_id" : 0,
"class_id" : 2,
"scores" : [
{
"type" : "exam",
"score" : 57.92947112575566
},
{
"type" : "quiz",
"score" : 21.24542588206755
},
{
"type" : "homework",
"score" : 68.19567810587429
},
{
"type" : "homework",
"score" : 67.95019716560351
},
{
"type" : "homework",
"score" : 18.81037253352722
}
]
}
我使用以下查询:
db.grades.aggregate([
{ $match: { student_id: 0 } },
{
$redact: {
$cond: {
if: { $eq: [ "$type" , "exam" ] },
then: "$$PRUNE",
else: "$$DESCEND"
}
}
}
]
);
通过此查询,如果找到每种类型的检查,则应排除此子文档。它是有效的,结果是:
{
"_id" : ObjectId("50b59cd75bed76f46522c34e"),
"student_id" : 0,
"class_id" : 2,
"scores" : [
{
"type" : "quiz",
"score" : 21.24542588206755
},
{
"type" : "homework",
"score" : 68.19567810587429
},
{
"type" : "homework",
"score" : 67.95019716560351
},
{
"type" : "homework",
"score" : 18.81037253352722
}
]
}
但如果我颠倒条件,我希望结果中只保留考试:
if: { $eq: [ "$type" , "exam" ] },
then: "$$DESCEND",
else: "$$PRUNE"
但是结果是空的
我不明白为什么不包括类型为“exam”的子文档。
$redact
阶段从根文档及其字段开始,只有当该文档满足$$down
的条件时,它才会检查该文档中包含的子文档。这意味着$redact对您的文档所做的第一件事是检查以下内容:
{
"_id" : ObjectId("50b59cd75bed76f46522c34e"),
"student_id" : 0,
"class_id" : 2,
"scores" : [] // Some array. I will look at this later.
}
它甚至在这里找不到type
字段,因此$eq:[“$type”,“exam”]
为false。当条件为false时,您让$redact做了什么else:“$$PRUNE”
,因此在检查子文档之前会对整个文档进行修剪
作为一种解决方法,测试
$type
是否为“exam”
或不存在。你没有明确要求一个有效的解决方案,因此,我将把它作为一个练习留给你们去弄清楚如何做。又是一个mongodb大学的家庭作业。@user3100115家庭作业问题不一定是坏问题,只要它们是以一种寻求洞察力的方式写的,而不仅仅是一个获得足够好分数的完成的解决方案。@Philipp,我从第一手的经验中知道,学生们每一步都是以一种相当长的方式被教授的。详细的,我可以补充,文档也不错。在我看来,每节课的目的都是给学生提供足够的信息,使文档或多或少成为一个提醒。在这种情况下,问题和现有的查询似乎有点。。。对我来说太武断了。不,这不是大学作业。2年前我已经通过了考试,但现在还没有修订。文件对我来说不清楚。我觉得这是问问题的好地方。好的,谢谢。我不是在寻找解决方案,但我在寻找解释,你的解释很棒。非常感谢。我正在尝试实施建议的解决方法,但无法使其生效。任何工作代码的例子将不胜感激@papaiatis请用您的示例文档和您已经尝试过的代码提出一个新问题。@Philipp