【问题标题】:Redact in mongodb seems obscure to memongodb中的编辑对我来说似乎晦涩难懂
【发布时间】:2015-09-19 02:27:08
【问题描述】:

我现在正在与编辑作斗争,但我不确定是否理解它。

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

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

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

然而结果是空的。

我不明白为什么不包括“考试”类型的子文档。

【问题讨论】:

  • 又是一个mongodb大学作业。
  • @user3100115 家庭作业问题不一定是坏问题,只要它们以寻求洞察力的方式编写,而不仅仅是获得足够高分的完成解决方案。
  • @Philipp 但是,我从第一手经验中知道,学生的每一步都以相当冗长的方式进行教学。详细的,我可能会补充,文档也不错。从我的角度来看,每个课程的目的是为学生提供足够的信息,以便文档或多或少地成为提醒。在这种情况下,与现有查询一起出现的问题似乎有点... ...对我来说是任意的。
  • 不,这不是大学作业。我在 2 年前就已经通过了考试,此时还没有编辑。我不清楚文档。我认为这是提出问题的正确地方。

标签: mongodb aggregation-framework


【解决方案1】:

$redact 阶段从根文档及其字段开始,只有当该文档满足$$DESCEND 的条件时,它才会检查该文档中包含的子文档。这意味着 $redact 对您的文档所做的第一件事就是检查以下内容:

{
    "_id" : ObjectId("50b59cd75bed76f46522c34e"),
    "student_id" : 0,
    "class_id" : 2,
    "scores" : [] // Some array. I will look at this later.
}

这里甚至找不到type 字段,所以$eq: [ "$type" , "exam" ] 是假的。当条件为假时,你告诉 $redact 做什么? else: "$$PRUNE",因此在检查子文档之前会修剪整个文档。

作为一种解决方法,测试$type"exam" 还是不存在。你没有明确要求一个可行的解决方案,所以我将把它作为练习留给你来弄清楚如何做到这一点。

【讨论】:

  • 好的,谢谢。我不是在寻找解决方案,而是在寻找解释,而您的解释很棒。非常感谢。
  • 我正在尝试实施建议的解决方法,但无法使其正常工作。任何示例工作代码将不胜感激!
  • @papaiatis 请用您的示例文档和您已经尝试过的代码提出一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-22
相关资源
最近更新 更多