我是纯 MongoDB 的新手,我对纯 MongoDB 有一些疑问。
1.纯MongoDB是否使用像Mongoose ODM这样的模式和模型?
如果您使用过 Mongoose ODM,您就会知道 Mongoose ODM 使用模式和模型来定义字段及其属性。像这样;
/* Dependencies */
const mongoose = require('mongoose');
/* Define the user schema */
const userSchema = new mongoose.Schema({
name: {
type: String,
required: true
},
lastname: {
type: String,
required: true
}
});
/* Define the model */
const User = mongoose.model('User', userSchema);
我们需要用它们的字段来定义模式和模型吗?
2.纯MongoDB有验证器吗?
例如,如果我们在模式中有一个字段;我们可以为字段定义一些属性,例如;
...
name: {
type: String, // Type built-in validator
required: true // Required built-in validator
},
points: {
type: Number, // Type built-in validator
min: 0, // Min (minimum) built-in validator
max: 100 // Max (maximum) built-in validator
},
verified: {
type: Boolean, // Type built-in validator
validate: { // Custom schema validator
validator: function(v) {
return this.points > 50;
},
message: 'You can not register!'
}
}
...
纯 MongoDB 是否支持任何验证器,或者我们在像这样的 CRUD 操作时定义它们;
function createUser(userData, db, callback) {
if(userData.name && typeof(userData.name) == 'string' && userData.username && typeof(userData.lastname) == 'string') { // Validator for object
const collection = db.collection('users');
collection.insertOne({
name: userData.name,
lastname: userData.lastname
}, function(err, result) {
if(err) callback(err, null);
console.log('One record writed!');
callback(null, result);
});
} else {
callback(new Error('You must enter name and lastname to register!', null));
}
}
我所有的问题都是关于这些的。谢谢...
不,MongoDB 服务器(在 4.0 中)没有模型或数据关系的概念。数据保存在Documents中,这些 Documents 以类似于 JSON 的二进制序列化格式(称为BSON)存储在服务器上。
MongoDB 服务器确实支持用于插入和更新文档的每个集合的验证规则。在 MongoDB 3.6中,验证规则是使用 JSON Schema 定义的;早期版本使用 MongoDB 查询运算符来表达验证规则。
Mongoose 与 MongoDB 模式验证
通常,目标是尽早验证数据,以便向最终用户提供及时的反馈并避免不必要的往返和处理。例如,验证可以发生在前端 UI、应用程序层和数据库层。前端 UI 通常具有基于数据类型和字段掩码的基本验证,而自定义验证、关系和业务逻辑通常更适合您的应用程序层。数据库验证是最后一项检查,以确保仅保留符合预期(但灵活)模式的数据。
使用像JSON Schema这样的提议标准可能允许验证规则由堆栈的多个层共享。大多数流行的编程语言和浏览器都有可用的JSON 模式实现。注意:MongoDB 的 JSON Schema 实现有一个Extension,它包含一个
bsonType
关键字以允许使用所有 MongoDB BSON 字段类型。MongoDB 服务器端 JSON Schema 验证的当前限制是它不提供详细的错误报告:文档验证成功或失败。您可能想要观看/支持 SERVER-20547:在 MongoDB Jira 问题跟踪器中公开操作未通过文档验证的原因。根据您的验证规则和选项,失败将导致错误(插入/更新被拒绝)或警告(插入/更新成功但导致日志消息)。应用程序代码的一些 JSON Schema 实现具有更详细的适合最终用户的验证报告。
MongoDB 支持模式验证。
根据Schema Vaidation的 MongoDB 官方文档。
MongoDB 提供了在更新和插入期间执行模式验证的能力。
您可以在创建集合时指定规则,也可以使用验证器选项向现有文档添加验证。
来自 MongoDB 文档的示例。
根据此处的 MongoDB 博客文档传统上,MongoDB 开发人员必须在他们的应用程序中实现自己的模式验证例程,但是 JSON 模式标准的到来、许多 JSON 模式验证器和 NewtonSoft 的优秀 .NET 验证库允许这样做以标准方式。
From Version 3.6
,MongoDB supports this standard and provides a JSON Schema Validator
从像触发器一样运行的应用程序中通过插入或更改检查对数据的任何更改。中引入了“验证模式”
3.2
,但3.6
看到了新标准方法的引入。因为它是行业标准,您可以选择在 MongoDB 中验证您的数据,以便您可以检查输入或更改的数据,或者您可以将其导出为标准 JSON,并在数据库外部进行验证。理想情况下,通过批量输入数据,您可以在导入之前对其进行验证。MongoDB是一个
document
面向数据库。它是由字段和值对组成的数据结构。MongoDB 文档类似于JSON
对象。字段的值可能包括其他文档、数组和文档数组。例如在这里,被验证或描述的 JSON 文档我们称为实例,包含描述的文档称为模式。
最基本的模式是一个空白的 JSON 对象,它什么都不约束,什么都允许,什么也不描述:
您可以通过向架构添加验证关键字来对实例应用约束。例如,“type”关键字可用于将实例限制为对象、数组、字符串、数字、布尔值或 null:
JSON Schema 检查的内容
JSON Schema 首先确定数据的存储方式。它旨在检查 JSON 文档,而不是 MongoDB 集合,因此我们需要将文档“集合”转换为文档数组。
但是,如果您向 mongo 集合提供 JSON Schema,那么它将像检查对象数组一样工作,但您可以配置验证级别(validationLevel) 和发现错误时采取的操作 (validationAction) .
开箱即用,它只会在更改或插入单个文档时检查它们。
如果您愿意,该模式无能为力。它可以检查的第一件事是数据在文档中的结构方式。
通常,数据存储为对象数组,但表格数据可以存储为数组数组。
然后它可以检查是否:
您可以定义每个属性的数据类型以及如何验证它以检查值的范围。
MongoDB 模式验证在行动
为了检查您的验证,您需要采取一些小步骤,并在高质量的 JSON 模式验证器中进行调试,例如Newtonsoft 的基于浏览器的验证器,它会突出显示断线,甚至解释失败的原因。
有很多方法可以验证属性值。一个很快出现的概念是子模式。这可以像 JSON Schema 空对象'
{}
'一样小,但通常更挑剔一些。