如何验证MongoDB嵌入式文档

3

MongoDB 3.2有一个很好的验证功能。然而,在这个文档中,它只向我展示了如何在第一级字段上进行验证。如果我要插入以下嵌入式文档,我该如何设置验证规则?

{"name": {
          "first_name": "xx",
          "last_name": "yy"
         }
}

我已经尝试了以下方法,但它不起作用:

db.createCollection( "name_collection",
    { validator: { $and:
        [
            {name.first_name: {$type: "string"}},
            {name.last_name: {$type: "string"}}
        ]
    }
)

提前感谢。

2个回答

3

以下是测试代码,它可以正常运行

> db.createCollection('name', {validator: {$and: [{"name.first_name": {$type: 'string'}}, {"name.last_name": {$type: 'string'}}]}})
{ "ok" : 1 }

似乎你需要在 name.last_name 中添加 ""
使用有效数据进行测试。
> db.name.insert({name: {first_name: 'xx', last_name: 'yy'}})
WriteResult({ "nInserted" : 1 })

使用无效数据进行测试

> db.name.insert({name: {first_name: 'xx', last_name: 3}})
WriteResult({
        "nInserted" : 0,
        "writeError" : {
                "code" : 121,
                "errmsg" : "Document failed validation"
        }
})

> db.name.find()
{ "_id" : ObjectId("56e8b644f33ed6e7f3c57f90"), "name" : { "first_name" : "xx",
"last_name" : "yy" } }

另外,您认为在类型中可以使用$or吗?例如,“first_name”可以是“string”或“null”类型? - yyforyongyu

1

你的代码片段中有几个错误。

你的db.createCollection没有匹配的括号。应该像这样:

db.createCollection("name_collection", {
  validator: { $and:[
    {'name.first_name': {$type: "string"}},
    {'name.last_name': {$type: "string"}}
  ]}
})

为了验证验证是否起作用,请尝试插入部分数据

 db.name_collection.insert({name:{first_name:0, last_name:0}})

我只是给first_name和last_name分配了数值,所以验证应该会失败。

执行上述查询后,会出现以下错误。

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

但是如果我将文本分配为下面粘贴的内容,插入应该会成功。

db.name_collection.insert({name:{first_name:'f_name', last_name:'l_name'}})

结果:

WriteResult({ "nInserted" : 1 })

希望这就是您正在寻找的内容。

这正是我一直在寻找的!非常感谢! - yyforyongyu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接