如果我有以下猫鼬模型:
// child.model.js
var mongoose = require('mongoose'),
Schema = mongoose.Schema,
childSchema = new Schema({
name: String,
age: Number
}, {collection: 'children'});
module.exports = mongoose.model('Child', childSchema);
//parent.model.js
var mongoose = require('mongoose'),
Child = require('./child.model.js'),
Schema = mongoose.Schema,
parentSchema = new Schema({
name: String,
children: [Child.schema]
});
module.exports = mongoose.model('Parent', parentSchema);
这是否意味着我会有两个系列,一个叫做父母'还有一个叫做“孩子”的孩子
正如我目前所理解的,上面的代码创建了一个嵌套的文档结构,其中Child
对象仅存在于Parent
文档的集合中。但是,我对{collection: 'name'}
选项感到困惑,您可以将其传递给Schema
构造函数。在创建像这样的子文档时,这个选项是否被忽略了?
答案 0 :(得分:2)
有两种子网 - Embedded和Referenced。这是一个Mongoose级别的分类。在MongoDB级别,它只是Collections和Documents。
Mongoose中嵌入式和引用式文档之间的区别在于前者类似于在父级中“嵌入”子模式。即就MongoDB而言,它(Parent)只是一个大文件。
在引用的文档中,父文档仅存储子文档的ObjectID,即子文档是“引用的”,并且它由您自己“populate”整个文档。
您正在使用的内容children: [Child.schema]
是嵌入式文档的语法。
这是否意味着我会有两个系列,一个叫做“父母”,另一个叫“儿童”?
所以你在MongoDB中只有一个集合。
但是,我对可以传递给Schema构造函数的{collection:'name'}选项感到困惑。在创建像这样的子文档时,这个选项是否被忽略了?
That option只是为了让你真正从该架构创建一个模型,它使用你提供的名称而不是自动推断。