MongoDB中的Validator不起作用

时间:2016-09-20 20:31:18

标签: mongodb validation

我最近开始使用MongoDB(版本3.2.9),并希望尝试它具有的验证功能,因为我喜欢数据库级的一致性。

我知道我可以而且应该只在业务逻辑中进行此验证,就像我已经做的那样。 但是有一个额外的安全层感觉很好。

我尝试添加一个集合category,其_id类型'int'name类型'string'desc类型{{ 1}}。

这些值应该都存在,但不会给出对内容的限制。

现在,在manual之后,我最终得到了以下代码:

'string'

然而,已经有了这个简单的结构,MongoDB抱怨道:

db.createCollection('category', {
  validator: { $or:
    [
      { _id: { $and: [ { $exists: true },
                       { $type: 'int' } ] } }, 
      { name: { $and: [ { $exists: true },
                        { $type: 'string' } ] } }, 
      { desc: { $and: [ { $exists: true },
                        { $type: 'string' } ] } }
    ]
  }
})

现在,我找到了this similar question,但只是尝试将多个约束直接放在{ "ok" : 0, "errmsg" : "unknown operator: $and", "code" : 2 } 数组中:

$or

但是现在,虽然它确实创建了它应该的集合,但我现在可以执行以下任何db.createCollection('category', { validator: { $or: [ { _id: { $exists: true } }, { _id: { $type: 'int' } }, { name: { $exists: true } }, { name: { $type: 'string' } }, { desc: { $exists: true } }, { desc: { $type: 'string' } } ] } }) 命令:

insert

db.category.insert({}) db.category.insert({_id: 17, name: '', desc: 'valid'}) db.category.insert({_id: 42, name: 42, desc: ''}) db.category.insert({_id: 43, name: '', desc: 42}) db.category.insert({_id: '', name: 42, desc: 42}) 现在返回

db.category.find()

作为最后的手段,我尝试将{ "_id" : ObjectId("57e19650b10ab85eca323684") } { "_id" : 17, "name" : "", "desc" : "valid" } { "_id" : 42, "name" : 42, "desc" : "" } { "_id" : 43, "name" : "", "desc" : 42 } { "_id" : "", "name" : 42, "desc" : 42 } 运算符更改为$or,因为它应该要求所有规则都有效,而不仅仅是至少一个。

$and

这种方法对我来说似乎最合理,但它根本不起作用 。无论上面提到的db.createCollection('category', { validator: { $and: [ { _id: { $exists: true } }, { _id: { $type: 'int' } }, { name: { $exists: true } }, { name: { $type: 'string' } }, { desc: { $exists: true } }, { desc: { $type: 'string' } } ] } }) 我尝试过使用哪一个,请注意,5个中有一个有效,没有任何作品,都给了我同样的错误:

inserts

如上所述,对WriteResult({ "nInserted" : 0, "writeError" : { "code" : 121, "errmsg" : "Document failed validation" } }) 的调用返回db.version(),我在Windows机器上运行默认的MongoDB 64位分发,只有3.2.9参数设置为先前的空目录。

1 个答案:

答案 0 :(得分:1)

请使用函数NumberInt()提供32位整数值。否则,它被解释为Double。

以下插入应成功将文档插入集合中。

成功案例:

db.category.insert({_id: NumberInt(17), name: "aaaa", desc: "valid"})

失败情景: -

db.category.insert({_id: NumberInt(42), name: 42, desc: ''})