programing

내장된 몽구스 채우기

subpage 2023. 7. 3. 22:53
반응형

내장된 몽구스 채우기

저는 Mongoose.js를 사용하며 3단계 계층 문서의 문제를 해결할 수 없습니다.

두 가지 방법이 있습니다.

번째 - 참조 없음.

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 = 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에 대해 정의되지 않은 값이 반환됩니다.그걸 채울 방법이 있나요?

감사해요.

Mongoose 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'을 참조하는 다른 입력 쿼리로 전달됩니다.

두 번째(내부) 채우기를 기록합니다. 여기서 마법이 발생합니다.그래프를 필요한 방식으로 작성할 때까지 이러한 채우기를 계속 사용하고 점점 더 많은 문서를 고정할 수 있습니다.

이것이 어떻게 작동하는지 이해하는 데는 약간의 시간이 걸리지만, 만약 당신이 그것을 통해 일한다면, 그것은 이치에 맞습니다.

Mongoose 4에서는 이렇게 여러 레벨을 채울 수 있습니다(다른 데이터베이스나 인스턴스에서도).

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

Mongoose 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

이것에 늦었지만, 저는 심층 모델 모집단을 수행하는 것을 매우 간단하게 만드는 Mongoose 플러그인을 작성했습니다.예를 들어, 이 작업을 수행하여 다음 항목을 채울 수 있습니다.b그리고.c:

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

다음과 같이 채워지는 각 경로에 대해 Mongoose 채우기 옵션을 지정할 수도 있습니다.

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

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

언급URL : https://stackoverflow.com/questions/13077609/mongoose-populate-embedded

반응형