복붙노트

[MONGODB] 몽구스의 채우기가 포함 된

MONGODB

몽구스의 채우기가 포함 된

나는 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);
});

하지만 난 내가 필요 단지 객체 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에 대한 정의되지 않은 반환합니다. 나는 그것을 채우는이 방법은?

감사.

해결법

  1. ==============================

    1.몽구스 4에서는 여러 단계에 걸쳐 문서를 채울 수 있습니다 :

    몽구스 4에서는 여러 단계에 걸쳐 문서를 채울 수 있습니다 :

    당신이 사용자의 친구를 추적 사용자 스키마를 말해봐.

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

    첫째로 채우기 ()는 사용자의 친구 목록을 얻을 수 있습니다. 그러나 당신은 또한 친구의 사용자의 친구를 원하는 경우 어떻게? 이 경우에는 모든 사용자의 친구의 친구의 배열을 채울 몽구스를 말할 채우기 옵션을 지정할 수 있습니다 :

    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 :에서 촬영

  2. ==============================

    2.몽구스 3.6 쿼리에 재귀 적으로 채우기 관련 문서에있는 기능의 추가되었습니다. 여기 당신이 그것을 할 수있는 방법의 예입니다 :

    몽구스 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);
                       }
                 );     
              });           
    

    이 경우, 나는 그들의 참조 문서에 'refUserListItems'에서 ID의 배열을 채우기입니다. 'refSuggestion를'- 쿼리의 결과는 다음 참조 원래 인구가 문서의 필드는 내가 채울 또한 원하는 또 다른 채우기 쿼리에 전달됩니다.

    두 번째 (내부) 채우기를 참고 - 마법이 일어나는 곳입니다. 당신이 당신의 그래프 당신이 그것을 필요로하는 방식을 구축 할 때까지 당신은 더 많은 문서에 둥지 이러한 채우고 압정을 계속할 수 있습니다.

    그것은이 작동하는 방법을 소화하기 위해 약간의 시간이 걸립니다,하지만 당신은 그것을 통해 작업하는 경우, 그것은 의미가 있습니다.

  3. ==============================

    3.몽구스 4에서이 같은 다단계를 채울 수 있습니다 (심지어 다른 데이터베이스 또는 인스턴스에서)

    몽구스 4에서이 같은 다단계를 채울 수 있습니다 (심지어 다른 데이터베이스 또는 인스턴스에서)

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

    4.나는이 늦게 해요,하지만 나는 그것이 매우 간단 깊은 모델 채우기를 수행 할 수 있도록하는 몽구스 플러그인을 썼다. 귀하의 예를 들어, 채우기 b와 c로이 작업을 수행 할 수 있습니다

    나는이 늦게 해요,하지만 나는 그것이 매우 간단 깊은 모델 채우기를 수행 할 수 있도록하는 몽구스 플러그인을 썼다. 귀하의 예를 들어, 채우기 b와 c로이 작업을 수행 할 수 있습니다

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

    또한이 같은 인구 경로, 각 몽구스의 채우기 옵션을 지정할 수 있습니다 :

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

    자세한 내용은 플러그인 설명서를 확인하십시오.

  5. from https://stackoverflow.com/questions/13077609/mongoose-populate-embedded by cc-by-sa and MIT license