Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
mongodb的修订对我来说似乎很模糊_Mongodb_Aggregation Framework - Fatal编程技术网

mongodb的修订对我来说似乎很模糊

mongodb的修订对我来说似乎很模糊,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我现在正在和修订作斗争,我不确定是否理解它 我刚刚阅读了文档,并尝试在一个集合等级上使用redact(它来自mongodb在线培训) 集合“grades”中的文档如下所示: { "_id" : ObjectId("50b59cd75bed76f46522c34e"), "student_id" : 0, "class_id" : 2, "scores" : [ { "type" : "exam",

我现在正在和修订作斗争,我不确定是否理解它

我刚刚阅读了文档,并尝试在一个集合等级上使用redact(它来自mongodb在线培训)

集合“grades”中的文档如下所示:

{
    "_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