对Mongoose / Mongo术语感到困惑。 Sub-Docs / Embedded-Docs也是收藏品吗?

时间:2015-07-18 02:02:09

标签: node.js mongodb mongoose

如果我有以下猫鼬模型:

// 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构造函数。在创建像这样的子文档时,这个选项是否被忽略了?

1 个答案:

答案 0 :(得分:2)

有两种子网 - EmbeddedReferenced。这是一个Mongoose级别的分类。在MongoDB级别,它只是CollectionsDocuments

Mongoose中嵌入式和引用式文档之间的区别在于前者类似于在父级中“嵌入”子模式。即就MongoDB而言,它(Parent)只是一个大文件。

在引用的文档中,父文档仅存储子文档的ObjectID,即子文档是“引用的”,并且它由您自己“populate”整个文档。

您正在使用的内容children: [Child.schema]是嵌入式文档的语法。

  

这是否意味着我会有两个系列,一个叫做“父母”,另一个叫“儿童”?

所以你在MongoDB中只有一个集合。

  

但是,我对可以传递给Schema构造函数的{collection:'name'}选项感到困惑。在创建像这样的子文档时,这个选项是否被忽略了?

That option只是为了让你真正从该架构创建一个模型,它使用你提供的名称而不是自动推断。