【问题标题】:Mongodb native validation for embedded documents嵌入式文档的MongoDB本机验证
【发布时间】:2017-11-22 06:48:46
【问题描述】:

我正在尝试提出一个 Mongodb 的本机验证规则,该规则将验证一个文档(具有嵌入式文档),使得嵌入式文档根本不存在,或者如果存在,它具有一个或多个强制存在的字段.

我在下面有一个例子。 JSON 文档有一个嵌入文档user。这个user 可能不存在,或者当它存在时它需要有一个字段name 强制存在。

"validator" : {
        "$or" : [
            {
                "user" : {
                    "$exists" : "false",
                    "$type" : "null"
                }
            },
            {
                "user.name" : {
                    "$type" : "string",
                    "$exists" : "true"
                }
            }
            ]
}

当我尝试将一个空的 JSON 文档插入到我的集合 testschema 中时,例如 db.testschema.insert({}),我得到下面的标准错误,它不能说明什么是错误的和/或为什么。这应该是可能的,因为我的文档可以包含带有 name 字段的嵌入文档 user,或者根本不包含嵌入文档。

WriteResult({
    "nInserted" : 0,
    "writeError" : {
        "code" : 121,
        "errmsg" : "Document failed validation"
    }
})

验证器中使用的运算符看起来是否正确?

【问题讨论】:

    标签: mongodb validation database-schema


    【解决方案1】:

    首先nulltruefalse 不应作为字符串传递,false 作为字符串传递将仅计算为true

    解决方案不需要 "$type" : null 验证器,只需 "$exists" : false 就足够了,以下验证将适合您

    "validator" : {
            "$or" : [
                {
                    "user" : {
                        "$exists" : false,
                    }
                },
                {
                    "user.name" : {
                        "$type" : "string",
                        "$exists" : true
                    }
                }
                ]
    }
    

    【讨论】:

    • 哇,我真笨!我记得我是如何得到双引号的——当您运行db.getCollectionInfos({name:'testschema'})[0].options.validator 命令以查看已经设置了哪些验证规则时,Mongo shell 将这些布尔值包装在双引号中!谢谢你的好建议!非常感谢。
    • 乐于助人!!
    猜你喜欢
    • 2017-07-25
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-15
    • 2012-08-31
    • 1970-01-01
    相关资源
    最近更新 更多