一尘不染

Mongoose 填充嵌入式

node.js

我使用Mongoose.js,无法解决3级层次结构文档的问题。

有2种方法可以做到。

首先 -没有裁判。

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

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

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

我需要出示C记录。仅知道_id的C,如何填充/找到它?

我曾尝试使用:

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。我有填充的方法吗?

Thanks.


阅读 307

收藏
2020-07-07

共1个答案

一尘不染

在Mongoose 4中,您可以跨多个级别填充文档:

假设您有一个User模式,该模式可以跟踪用户的朋友。

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' }
  });

Taken from: http://mongoosejs.com/docs/populate.html#deep-populate

2020-07-07