其实是两个问题,你通常最好问一个,以备将来参考。
1。多元化
简短的形式是好的做法。更详细地说,这通常是合乎逻辑的,因为您所指的是项目或对象的“集合”。因此,“集合”中的一般推论是“许多”,因此是“对象”本身命名的复数形式。
所以一个“人”集合意味着它实际上是由许多“人”对象组成的,就像“狗”到“狗”或“猫”到“猫”一样。不一定是“牛”到“牛”,但一般来说,猫鼬并不真正处理多态实体,所以那里不会有“公牛”或“野牛”对象,除非只是由一些其他属性指定为“牛”。
如果您愿意,您当然可以更改此格式并指定您自己的姓名:
var personSchema = new Schema({ ... },{ "collection": "person" });
mongoose.model( "Person", personSchema, "person" );
但是一个模型通常是一个“单数”模型名称,而“集合”是良好实践的复数形式,当有很多时。此外,我能想到的每一个 SQL 数据库 ORM 也是这样做的。所以这实际上只是遵循大多数人们已经习惯的做法。
2。为什么选择架构?
MongoDB实际上是“无模式”的,因此它没有任何“模式”的内部概念,这与基于SQL的关系数据库在“表”定义中拥有自己的“模式”定义的一大区别。
虽然这实际上通常是 MongoDB 的“优势”,因为数据不依赖于特定布局,但有些人实际上喜欢这种方式,或者通常希望以其他方式封装控制数据存储方式的逻辑。
由于这些原因,猫鼬支持定义“架构”的概念。这使您可以在“绑定”到的集合(模型)中说明“哪些字段”是“允许的”,以及可能包含哪些“类型”的数据。
您当然可以采用“无模式”方法,但您“绑定”到模型的模式对象仍然必须定义,而不是“严格”:
var personSchema = new Schema({ },{ "strict": false });
mongoose.model( "Person", personSchema );
然后你几乎可以添加任何你想要的数据作为数据,没有任何限制。
相反的情况是人们“通常”确实希望强制执行某种类型的规则,例如哪些字段和哪些类型。这意味着只有“定义”的事情才会发生:
var personSchema = new Schema({
name: { type: String, required: true },
age: Number,
sex: { type: String, enum: ["M","F"] },
children: [{ type: Schema.Types.ObjectId, ref: "Person" }],
country: { type: String, default: "Australia" }
});
所以那里的规则分解为:
“名称”中必须只有“字符串”数据。这里有点 JavaScript 习惯用法,因为 JavaScript 中的所有内容实际上都会字符串化。这里的另一件事是“必需”,因此如果发送到.save() 的对象中不存在此字段,它将引发验证错误。
“年龄”必须是数字。如果您尝试使用此字段中提供的数字以外的数据来.save() 此对象,则会引发验证错误。
"sex" 必须又是一个字符串,但这次我们要添加一个“约束”来说明有效值是什么。同样,如果您不提供正确的数据,这也会引发验证错误。
“children”实际上是一个项目数组,但这些只是指向另一个模型中不同项目的“参考”ObjectId 值。或者在这种情况下这个。因此,当您添加到“孩子”时,这将保留该 ObjectId 引用。 Mongoose 实际上可以 .populate() 这些稍后在请求时使用它们的实际“Person”对象。这模拟了 MongoDB 中的一种“嵌入”形式,但在您实际想要单独存储对象而不是每次都“嵌入”时使用。
“country”再次只是一个字符串,不需要什么特别的,但如果没有明确提供其他值,我们会给它一个默认值。
你可以做很多其他的事情,我建议你仔细阅读the documentation。那里对所有内容都进行了详细解释,如果您有具体问题,可以随时问“这里”(例如)。
因此,MongoDB 的处理方式与 SQL 数据库的工作方式不同,并且抛弃了一些通常“认为”的东西,以便更好地在应用程序业务逻辑层实现。
因此在 Mongoose 中,它试图“放回”人们喜欢使用传统关系数据库的一些好处,并允许在不编写其他代码的情况下轻松封装一些规则和良好实践。
那里还有一些逻辑有助于“模拟”(强调不够)“加入”,因为有些方法可以“帮助”您从其他来源检索“相关”数据,基本上是提供定义数据驻留在“架构”定义中的哪个“模型”。
我是否还没有提到“架构”定义再次只是对象并且可重用?是的,它们实际上可以与“许多”模型相关联,这些模型可能驻留在同一个数据库中,也可能不驻留在同一个数据库中。
这里的每样东西都比你目前所知道的功能和目的要多得多,这里的好建议是前进和“学习”。这是通向实现的通常途径……“哦,现在我明白了,他们就是这样做的”。