javascript-猫鼬-子架构参考父级子文档

猫鼬模式是否可能类似于以下内容:

var categorySchema = new Schema({
    name : String
});

var childSchema = new Schema({
   name : String,
   category : {
      type : Schema.Types.ObjectId,
      ref : 'parent.categories'
   }
});

var parentSchema = new Schema({
    categories : [categorySchema],
    children : [childSchema]
});

基本上,子级只能具有其父级包含的类别.我想做的事可能吗?如果不是,最干净的方法是什么?

解决方法:

如果categorySchema中只有一个字段名称,也许您可​​以将其放到parentSchema中,而无需进行如下填充,

var childSchema = new Schema({
   name : String,
   category : {
      name: String
   }
});

var parentSchema = new Schema({
    categories : [{name: String}],
    children : [childSchema]
});

当尝试将新的子代插入父代时,您可以先查询父代,然后迭代类别以获取现有子代并将其添加到子代中,将父代保存为最后,示例代码如下

Parent.find({_id: parent._id})
      .exec(function(err, p) {
          if (err) throw err;
          var p = new Child({name: 'tt'});
          p.categories.forEach(function(c) {
              if (c /*find the match one*/) {
                  p.category = c; // assign the existing category to children
              }
          });
          // save this parent
          p.save(function(err) {...});
      });  

如果categorySchema中有许多字段,则可以将其定义为单个模式,这是一个选择,如果Parent中有很多类别会使父集合太大.

var categorySchema = new Schema({
    name : String,
    // other fields....
});
var Category = mongoose.model('Category', categorySchema);

var childSchema = new Schema({
   name : String,
   category : {type : Schema.Types.ObjectId, ref : 'Category'}
});

var parentSchema = new Schema({
    categories : [{type : Schema.Types.ObjectId, ref : 'Category'}],
    children : [childSchema]
});

尝试将新的子级添加到父级文档时,逻辑与上述相同.

上一篇:《Entity Framework 6 Recipes》翻译系列 (5) -----第二章 实体数据建模基础之有载荷和无载荷的多对多关系建模


下一篇:javascript – MongoDB mongoose collection.find选项弃用警告