如何使用mongodb验证器验证对象数组?

时间:2017-01-06 11:24:24

标签: mongodb mongodb-query

我一直在尝试使用MongoDB提供的验证器来验证我的数据,但是我遇到了一个问题。这是我正在插入的简单用户文档。

{
    "name"    : "foo",
    "surname" : "bar",
    "books"   : [
      {
        "name" : "ABC",
        "no"   : 19
      },
      {
        "name" : "DEF",
        "no"   : 64
      },
      {
        "name" : "GHI",
        "no" : 245
      }
    ]
}

现在,这是已应用于用户集合的验证器。但是现在这对于我正在插入文档的books数组起作用。我想检查对象内部的元素,这些元素是books数组的成员。对象的架构不会改变。

db.runCommand({
  collMod: "users",
  validator: {
    $or : [
      { "name"       : { $type : "string" }},
      { "surname"    : { $type : "string" }},
      { "books.name" : { $type : "string" }},
      { "books.no"   : { $type : "number" }}
    ],
  validationLevel: "strict"
});

我知道这个验证器适用于成员对象而不适用于数组,但是我如何验证这样的对象呢?

2 个答案:

答案 0 :(得分:3)

问了这个问题已经很久了。
无论如何,只要有人通过这个。

对于 MongoDB 3.6 和更高版本,可以使用验证器来实现。


 db.createCollection("users", {
    validator: {
       $jsonSchema: {
          bsonType: "object",
          required: ["name","surname","books"],
          properties: {
            name: {
                bsonType: "string",
                description: "must be a string and is required"
             },    
             surname: {
                bsonType: "string",
                description: "must be a string and is required"
             },         
             books: {
                bsonType: [ "array" ],
                items: {
                    bsonType: "object",
                    required:["name","no"],
                    properties:{
                        name:{
                            bsonType: "string",
                            description: "must be a string and is required"
                        },
                        no:{
                            bsonType: "number",
                            description: "must be a number and is required"
                        }
                    }
                },
                description: "must be a array of objects containing name and no"
             }
          }
       }
    }
 })

这可以满足您的所有要求。
有关更多信息,请参阅此link

答案 1 :(得分:0)

您可以在3.6版中使用$jsonSchema表达式。

JsonSchema允许定义field as an array并为所有元素指定架构约束,以及为单个数组元素指定特定约束。

This blog post有许多示例,可帮助您弄清楚语法。