验证插入或更新到MongoDB中的数据的最佳方法是什么?是编写某种服务器执行的Javascript代码进行验证吗?
答案 0 :(得分:10)
从 MongoDB 3.2 开始,他们添加了document validation(slides)。
您可以使用validator选项使用几乎所有mongo查询运算符($geoNear
,$near
,$nearSphere
,$text
除外,为每个集合指定验证规则,和$where
)。
要使用验证器创建新集合,请使用:
db.createCollection("your_coll", {
validator: { `your validation query` }
})
要将验证器添加到现有集合,您可以添加验证器:
db.createCollection("your_coll", {
validator: { `your validation query` }
})
验证仅适用于插入/更新,因此当您在旧集合上创建验证器时,以前的数据将不会被验证(您可以为以前的数据编写应用程序级别验证)。您还可以指定validationLevel和validationAction来说明如果文档无法通过验证会发生什么。
如果您尝试使用未通过验证的内容插入/更新文档(并且未指定任何奇怪的validationLevel / action),那么您将在writeResult
上收到错误(遗憾的是,错误无法告诉您你失败了什么,你只得到默认validation failed
):
WriteResult({
"nInserted" : 0,
"writeError" : {
"code" : 121,
"errmsg" : "Document failed validation"
}
})
答案 1 :(得分:6)
MongoDB没有约束或触发器,因此应用程序必须验证数据。
如果存在无效数据,您还可以编写每天检查一次或更多的Javascript脚本。您可以使用它来检查应用程序的业务逻辑的质量。
答案 2 :(得分:1)
我认为您的应用处理此类事情是正常的。如果数据在某种程度上无效,请不要将其添加到数据存储区,直到用户更正您检测到的任何错误为止。
答案 3 :(得分:1)
从2.4开始,MongoDB在写入MongoDB数据文件时为mongod和mongorestore启用基本的BSON对象验证。这可以防止任何客户端将无效或格式错误的BSON插入MongoDB数据库。 来源:http://docs.mongodb.org/manual/release-notes/2.4/
答案 4 :(得分:1)
从 MongoDB 3.6 开始,您还可以使用 JSON Schema 来表达 validation rules。这些检查将在插入/更新时在数据库端进行。
以下是文档中的示例:
validator = {
$jsonSchema: {
bsonType: "object",
required: [ "name", "year", "major", "address" ],
properties: {
name: {
bsonType: "string",
description: "must be a string and is required"
},
year: {
bsonType: "int",
minimum: 2017,
maximum: 3017,
description: "must be an integer in [ 2017, 3017 ] and is required"
},
major: {
enum: [ "Math", "English", "Computer Science", "History", null ],
description: "can only be one of the enum values and is required"
},
gpa: {
bsonType: [ "double" ],
description: "must be a double if the field exists"
},
address: {
bsonType: "object",
required: [ "city" ],
properties: {
street: {
bsonType: "string",
description: "must be a string if the field exists"
},
city: {
bsonType: "string",
description: "must be a string and is required"
}
}
}
}
}
}
db.runCommand( {
collMod: "collectionName",
validator: validator
} )
答案 5 :(得分:0)
我刚刚开始在基于Zend Framework的应用程序中使用MongoDB和PHP。
我为每个MongoDB集合创建了一个对象(例如User.php映射到用户集合)。每个对象都知道它映射到哪个集合,以及需要哪些字段。它还知道哪些过滤器(Zend_Filter_Input)和验证器(Zend_Validate)应该应用于每个字段。在执行MongoDB insert()或save()之前,我运行$ object-> isValid(),它执行所有验证器。如果它们全部通过isValid()将返回true,我继续运行insert()或save(),否则我显示错误。