如何验证mongodb模式中的列表?

时间:2019-04-06 13:59:27

标签: javascript json mongodb jsonschema

我正在创建具有房间类型(双人,单人,套间)的HOME集合验证,并且验证应允许添加列出的所有项目。

height: auto

这就是我在验证器中拥有的

"rooms.type": {bsonType: ["ensuite", "double", "single"]},

我遇到了一个错误

db.createCollection("home", { 
validator : {
    $jsonSchema : {
    bsonType: "object",
    required: ["address.line1", "address.town", "rooms.type", 
    "rooms.qty", "rooms.price"],
 properties: {
    "address.line1": {bsonType: "string"},
    "address.town": {bsonType: "string"},
    "rooms.type": {bsonType: ["ensuite", "double", "single"]},
    "rooms.qty": {bsonType: "int", minimum: 0},
    "rooms.price": {bsonType: ["double"], minimum: 0},
}}}})

我希望数组room.type允许架构中指定的组中的一个或所有属性。

2 个答案:

答案 0 :(得分:1)

您可以指定rooms.type的类型应为“数组”,数组中至少包含1个项目,并且该数组的每个项目都应为枚举,如下所示:

"rooms.type": {
    type: "array",
    minItems: 1,
    items: {
        enum: ["ensuite", "double", "single"]
    }
}

MongoDB有documentation on $jsonSchema,但是您可以在MongoDB文档链接的JSON Schema validation spec中找到更多详细信息。

答案 1 :(得分:1)

您还可以通过以下方式指定架构:

db.createCollection('home', {
  validator: {
    $jsonSchema: {
      bsonType: 'object',
      required: ['address', 'rooms'],
      properties: {
        address: {
          bsonType: 'object',
          additionalProperties: false,
          required: ['line1', 'town'],
          properties: {
            line1: {
              bsonType: 'string'
            },
            town: {
              bsonType: 'string'
            }
          }
        },
        rooms: {
          bsonType: 'object',
          additionalProperties: false,
          required: ['type', 'qty', 'price'],
          properties: {
            type: {
              bsonType: 'string',
              enum: ["ensuite", "double", "single"]
            },
            qty: {
              bsonType: 'int',
              minimum: 0
            },
            price: {
              bsonType: 'array',
              items: {
                bsonType: 'double',
                minimum: 0
              }
            }
          }
        }
      }
    }
  }
});