首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >mongodb中的Redact在我看来是模糊的

mongodb中的Redact在我看来是模糊的
EN

Stack Overflow用户
提问于 2015-09-18 13:36:56
回答 1查看 3.8K关注 0票数 12

我现在在和redact吵架,我不确定我能理解它。

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

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

代码语言:javascript
运行
复制
{
    "_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
        }
    ]
}

我使用以下查询:

代码语言:javascript
运行
复制
db.grades.aggregate([
    { $match: { student_id: 0 } },
    { 
        $redact: {
            $cond: {
                if: { $eq: [ "$type" , "exam" ] },
                then: "$$PRUNE",
                else: "$$DESCEND"
            }
        }
    }

] );

使用此查询,可以找到每个类型的考试,应排除该子文档。它起作用了,结果是:

代码语言:javascript
运行
复制
{
    "_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
    }
]
}

但如果我把情况颠倒过来,我希望结果中只保留考试:

代码语言:javascript
运行
复制
if: { $eq: [ "$type" , "exam" ] },
       then: "$$DESCEND",
       else: "$$PRUNE" 

然而,结果是空的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-09-18 14:05:25

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

代码语言:javascript
运行
复制
{
    "_id" : ObjectId("50b59cd75bed76f46522c34e"),
    "student_id" : 0,
    "class_id" : 2,
    "scores" : [] // Some array. I will look at this later.
}

这里甚至没有找到一个type字段,所以$eq: [ "$type" , "exam" ]是假的。当条件为false时,您让$redact做什么?else: "$$PRUNE",所以在检查子文档之前,会对整个文档进行修剪。

作为解决办法,测试$type"exam"还是不存在。您并没有明确地要求一个有效的解决方案,所以我将把它作为一个练习,让您来研究如何做到这一点。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32653442

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档