我最近开始使用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
参数设置为先前的空目录。
答案 0 :(得分:1)
请使用函数NumberInt()
提供32位整数值。否则,它被解释为Double。
以下插入应成功将文档插入集合中。
成功案例:
db.category.insert({_id: NumberInt(17), name: "aaaa", desc: "valid"})
失败情景: -
db.category.insert({_id: NumberInt(42), name: 42, desc: ''})