복붙노트

[MONGODB] 중첩 된 배열을 채울 몽구스

MONGODB

중첩 된 배열을 채울 몽구스

다음 3 개 모델을 가정 :

var CarSchema = new Schema({
  name: {type: String},
  partIds: [{type: Schema.Types.ObjectId, ref: 'Part'}],
});

var PartSchema = new Schema({
  name: {type: String},
  otherIds: [{type: Schema.Types.ObjectId, ref: 'Other'}],
});

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

내가 차를 쿼리 할 때 나는 부분을 채울 수 있습니다 :

Car.find().populate('partIds').exec(function(err, cars) {
  // list of cars with partIds populated
});

중첩 된 부분으로 otherIds을 채울 수 몽구스의 방법은 모든 차를 위해 객체가있다.

Car.find().populate('partIds').exec(function(err, cars) {
  // list of cars with partIds populated
  // Try an populate nested
  Part.populate(cars, {path: 'partIds.otherIds'}, function(err, cars) {
    // This does not populate all the otherIds within each part for each car
  });
});

아마 반복 처리 각 차량 이상과 채울 시도 할 수 있습니다 :

Car.find().populate('partIds').exec(function(err, cars) {
  // list of cars with partIds populated

  // Iterate all cars
  cars.forEach(function(car) {
     Part.populate(car, {path: 'partIds.otherIds'}, function(err, cars) {
       // This does not populate all the otherIds within each part for each car
     });
  });
});

문제는 각 채우기 호출을 반환 모든 작업이 완료 될 때까지 기다려야하고 비동기 같은 lib 디렉토리를 사용하여 가지고있다.

가능한 모든 차에 걸쳐 반복하지 않고 할까?

해결법

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

    1.업데이트 : 아래에 요약 몽구스 4에 추가 된 컴팩트 버전 트린 호앙 Nhu는의 답변을 참조하십시오 :

    업데이트 : 아래에 요약 몽구스 4에 추가 된 컴팩트 버전 트린 호앙 Nhu는의 답변을 참조하십시오 :

    Car
      .find()
      .populate({
        path: 'partIds',
        model: 'Part',
        populate: {
          path: 'otherIds',
          model: 'Other'
        }
      })
    

    3, 아래를 몽구스 :

    Car
      .find()
      .populate('partIds')
      .exec(function(err, docs) {
        if(err) return callback(err);
        Car.populate(docs, {
          path: 'partIds.otherIds',
          model: 'Other'
        },
        function(err, cars) {
          if(err) return callback(err);
          console.log(cars); // This object should now be populated accordingly.
        });
      });
    

    이 같은 중첩 된 인구를 들어, 몽구스에게 당신이에서 채울하려는 스키마를 말해야한다.

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

    2.몽구스 4 지원이

    몽구스 4 지원이

    Car
    .find()
    .populate({
      path: 'partIds',
      model: 'Part',
      populate: {
        path: 'otherIds',
        model: 'Other'
      }
    })
    
  3. ==============================

    3.사용 몽구스 deepPopulate 플러그인

    사용 몽구스 deepPopulate 플러그인

    car.find().deepPopulate('partIds.otherIds').exec();
    
  4. ==============================

    4.그것은 더 나은에 있어야한다입니다

    그것은 더 나은에 있어야한다입니다

    Car
    .find()
    .populate({
        path: 'partIds.othersId'
    })
    
  5. from https://stackoverflow.com/questions/28179720/mongoose-populate-nested-array by cc-by-sa and MIT license