猫鼬填入嵌入式(Mongoose populate embedded)

2019-07-02 15:20发布

我用Mongoose.js并不能解决3个层次结构文档的问题。

有2种方法来做到这一点。

首先 -没有裁判。

C = new Schema({
    'title': String,
});

B = new Schema({
    'title': String,
    'c': [C]
});

A = new Schema({
    'title': String,
    'b': [B]
});

我需要播放c记录。 我怎样才能填充/找到它,只知道的C _id?

我尝试使用:

A.findOne({'b.c._id': req.params.c_id}, function(err, a){
    console.log(a);
});

但我不知道如何从一个returnet对象只得到C的对象,我需要。

其次 ,如果有裁判工作:

C = new Schema({
    'title': String,
});

B = new Schema({
    'title': String,
    'c': [{ type: Schema.Types.ObjectId, ref: 'C' }]
});

A = new Schema({
    'title': String,
    'b': [{ type: Schema.Types.ObjectId, ref: 'B' }]
});

如何填充所有B,C的记录得到的层次结构?

我尝试使用这样的:

A
.find({})
.populate('b')
.populate('b.c')
.exec(function(err, a){
    a.forEach(function(single_a){
        console.log('- ' + single_a.title);
        single_a.b.forEach(function(single_b){
            console.log('-- ' + single_b.title);
            single_b.c.forEach(function(single_c){
                console.log('--- ' + single_c.title);
            });
        });
    });
});

但它会为single_c.title返回undefined。 我有办法来填充呢?

谢谢。

Answer 1:

在猫鼬4您可以填写多个层面的文件:

假设你有一个用户模式以跟踪用户的朋友。

var userSchema = new Schema({
  name: String,
  friends: [{ type: ObjectId, ref: 'User' }]
});

首先populate()让你得到的用户朋友列表。 但是,如果你也想的朋友用户的朋友? 在这种情况下,你可以指定一个populate选项来告诉猫鼬填充friends的所有用户的朋友阵:

User.
  findOne({ name: 'Val' }).
  populate({
    path: 'friends',
    // Get friends of friends - populate the 'friends' array for every friend
    populate: { path: 'friends' }
  });

:来自http://mongoosejs.com/docs/populate.html#deep-populate



Answer 2:

猫鼬3.6的递归填充相关文档的能力,在查询中已添加。 这里是一个如何做到这一点的例子:

 UserList.findById(listId)
         .populate('refUserListItems')
         .exec(function(err, doc){
             UserListItem.populate(doc.refUserListItems, {path:'refSuggestion'},
                   function(err, data){
                        console.log("User List data: %j", doc);
                        cb(null, doc);
                   }
             );     
          });           

在这种情况下,我填充的ID在与他们的参考文件“refUserListItems”的数组。 查询的结果然后被传递到另一个填入查询引用了我也想填充的原始文件填充的领域 - “refSuggestion”。

注意第二个(内部)填入 - 这就是魔法发生。 您可以继续窝这些填充和粘性上越来越多的文件,直到你建立你的图表,你需要的方式。

这需要一些时间来消化,这是如何工作的,但如果你通过它的工作,这是有道理的。



Answer 3:

在猫鼬4您可以填写多这样的(即使是在不同的数据库或实例)

A
.find({})
.populate({
  path: 'b', 
  model: 'B',
  populate: {
    path: 'c',
    model: 'C'
  }
})
.exec(function(err, a){});


Answer 4:

我迟到了这一点,但我写了一个猫鼬的插件 ,使得它非常简单的进行深层模型人口。 对于你的榜样,你可以做到这一点来填充bc

A.find({}, function (err, docs) {
  A.deepPopulate(docs, 'b.c', cb)
}

您还可以指定猫鼬填充选项每个填充路径,像这样的:

A.deepPopulate(docs, 'b.c', {
  b: { 
    select: 'name'
  }
}, cb)

退房的插件文件以获取更多信息。



文章来源: Mongoose populate embedded