11

验证正在插入或更新到 MongoDB 的数据的最佳方法是什么?是编写某种服务器执行的 Javascript 代码来进行验证吗?

4

6 回答 6

11

MongoDB 3.2开始,他们添加了文档验证幻灯片)。

您可以使用验证器选项为每个集合指定验证规则,该选项使用几乎所有 mongo 查询运算符(除了$geoNear$near$nearSphere$text$where)。

要使用验证器创建新集合,请使用:

db.createCollection("your_coll", {
  validator: { `your validation query` }
})

要将验证器添加到现有集合,您可以添加验证器:

db.createCollection("your_coll", {
  validator: { `your validation query` }
})

验证仅适用于插入/更新,因此当您在旧集合上创建验证器时,以前的数据将不会被验证(您可以为以前的数据编写应用程序级别的验证)。您还可以指定validationLevelvalidationAction来告诉如果文档没有通过验证会发生什么。

如果您尝试使用验证失败的内容插入/更新文档(并且没有指定任何奇怪的验证级别/操作),那么您将收到一个错误writeResult(遗憾的是,该错误并没有告诉您失败的原因,您只会得到默认值validation failed):

WriteResult({
   "nInserted" : 0,
   "writeError" : {
      "code" : 121,
      "errmsg" : "Document failed validation"
   }
})
于 2015-11-09T04:24:08.090 回答
6

MongoDB 没有约束或触发器,因此应用程序必须验证数据。

如果有无效数据,您还可以编写每天检查一次或更多次的 Javascript 脚本。您可以使用它来检查应用程序业务逻辑的质量。

于 2010-02-15T12:35:11.643 回答
1

从 2.4 开始,MongoDB 在写入 MongoDB 数据文件时为 mongod 和 mongorestore 启用了基本的 BSON 对象验证。这可以防止任何客户端将无效或格式错误的 BSON 插入 MongoDB 数据库。来源:http ://docs.mongodb.org/manual/release-notes/2.4/

于 2013-09-10T13:05:43.230 回答
1

我认为您的应用程序处理这种事情是正常的。如果数据在某些方面无效,请不要让它添加到数据存储中,直到用户更正您检测到的任何错误。

于 2010-02-14T09:52:58.893 回答
1

从 MongoDB 3.6 开始,您还可以使用 JSON Schema 来表达验证规则。这些检查将在插入/更新时在数据库端进行。

这是文档中的一个示例:

   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
} )
于 2021-05-10T20:58:42.297 回答
0

我刚刚开始在基于 Zend 框架的应用程序中同时使用 MongoDB 和 PHP。

我为每个 MongoDB 集合创建了 1 个对象(例如 User.php 映射到用户集合)。每个对象都知道它映射到哪个集合,以及需要哪些字段。它还知道哪些过滤器(Zend_Filter_Input)和验证器(Zend_Validate)应该应用于每个字段。在执行 MongoDB insert() 或 save() 之前,我运行 $object->isValid(),它会执行所有验证器。如果它们都通过了 isValid() 将返回 true,然后我继续运行 insert() 或 save(),否则我将显示错误。

于 2011-01-14T03:55:59.053 回答