복붙노트

[MONGODB] 몽구스 : 깊은 인구 (채워진 필드를 채울)

MONGODB

몽구스 : 깊은 인구 (채워진 필드를 채울)

나는 종류의 모델을 가지고 :

Category:
    ...
    articles: [{type:ObjectId, ref:'Article'}]

제 모델은 계정 모델에 심판을 포함한다.

Article:
    ...
    account: {type:ObjectId, ref:'Account'}

그래서, 인구 기사와 종류의 모델이 될 것입니다 :

{ //category
    articles: //this field is populated
     [ { account: 52386c14fbb3e9ef28000001, // I want this field to be populated
         date: Fri Sep 20 2013 00:00:00 GMT+0400 (MSK),
         title: 'Article 1' } ],
    title: 'Category 1' }

질문은 다음과 같습니다 채워진 필드 ([관련 기사])의 서브 필드 (계정)을 채우는 방법? 여기에 내가 지금 그것을 할 방법입니다 :

globals.models.Category
    .find
        issue : req.params.id
        null
        sort:
            order: 1
    .populate("articles") # this populates only article field, article.account is not populated
    .exec (err, categories) ->
        console.log categories

몽구스 : 채우기에게 채워진 필드를하지만, 실제 솔루션을 찾을 수 없습니다 나는 여기에서 논의 된 알

해결법

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

    1.몽구스는 이제 깊은 협회를위한 새로운 방법 Model.populate있다 :

    몽구스는 이제 깊은 협회를위한 새로운 방법 Model.populate있다 :

    https://github.com/Automattic/mongoose/issues/1377#issuecomment-15911192

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

    2.첫째, 업데이트 4 3 몽구스 및 다음 아래로 몽구스 깊은 인구 간단한 방법을 사용합니다 :

    첫째, 업데이트 4 3 몽구스 및 다음 아래로 몽구스 깊은 인구 간단한 방법을 사용합니다 :

    당신은 당신이 스키마 검토 용 아이디 심판 일부 리뷰가 사용자의 아이디 심판 및 다음과 같이 사용자 ID 가진 블로그 스키마가 있다고 가정. 그래서 기본적으로 세 가지 스키마를 가지고 : 1. 블로그 2. 사용자 3. 검토

    그리고, 당신은 사용자가이 블로그 및 사용자 리뷰를 소유 블로그에서 쿼리에 있습니다. 당신은 당신의 결과로 조회 할 수 있습니다 :

    BlogModel
      .find({})
      .populate({
        path : 'userId',
        populate : {
          path : 'reviewId'
        }
      })
      .exec(function (err, res) {
    
      })
    
  3. ==============================

    3.여러 단계에 걸쳐 채우기

    여러 단계에 걸쳐 채우기

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

    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

  4. ==============================

    4.너무 조금 늦게 될 수도 있지만 나는 몽구스는 임의의 중첩 수준에서 깊은 채우기를 수행하는 플러그인 썼다. 이 플러그인은 등록하면 카테고리의 기사를 채우고 단지 하나의 선으로 계정 수 :

    너무 조금 늦게 될 수도 있지만 나는 몽구스는 임의의 중첩 수준에서 깊은 채우기를 수행하는 플러그인 썼다. 이 플러그인은 등록하면 카테고리의 기사를 채우고 단지 하나의 선으로 계정 수 :

    Category.deepPopulate(categories, 'articles.account', cb)
    

    당신은 또한 선택 ... 각각의 인구가 경로, 제한 등의 제어 것들로 채우기 옵션을 지정할 수 있습니다. 자세한 내용은 플러그인 설명서를 체크 아웃.

  5. ==============================

    5.3.6이를 달성하기 가장 쉬운 방법은 Model.populate를 사용하는 것이다.

    3.6이를 달성하기 가장 쉬운 방법은 Model.populate를 사용하는 것이다.

    User.findById(user.id).select('-salt -hashedPassword').populate('favorites.things').exec(function(err, user){
        if ( err ) return res.json(400, err);
    
        Thing.populate(user.favorites.things, {
            path: 'creator'
            , select: '-salt -hashedPassword'
        }, function(err, things){
            if ( err ) return res.json(400, err);
    
            user.favorites.things = things;
    
            res.send(user.favorites);
        });
    });
    
  6. ==============================

    6.죄송합니다 귀하의 거품 파열,하지만 직접 지원 솔루션이 거기 아니에요합니다. Github에서의 문제점 # 601에 관해서는, 그것은 잔인한 보인다. 개발자가 문제가 수동 재귀 / 깊은 인구에 만족 인정 같은 3.6 릴리스 노트에 따르면, 그것은 보인다.

    죄송합니다 귀하의 거품 파열,하지만 직접 지원 솔루션이 거기 아니에요합니다. Github에서의 문제점 # 601에 관해서는, 그것은 잔인한 보인다. 개발자가 문제가 수동 재귀 / 깊은 인구에 만족 인정 같은 3.6 릴리스 노트에 따르면, 그것은 보인다.

    그래서 릴리스 노트에서 권장되는 방법은 응답을 보내기 전에 더 채우기 위해 사용 categories.populate, 그래서 당신의 간부 인 () 함수에서 콜백 둥지 채워 호출하는 것입니다.

  7. ==============================

    7.

    globals.models.Category.find()
      .where('issue', req.params.id)
      .sort('order')
      .populate('articles')
      .exec(function(err, categories) {
    
        globals.models.Account.populate(categories, 'articles.account', function(err, deepResults){
    
          // deepResult is populated with all three relations
          console.log(deepResults[0].articles[0].account);
    
        });
    });
    

    다음의 예는 @codephobia를 묻는 질문에서 영감을 많은 관계의 두 가지 수준을 채 웁니다. 먼저 사용자를 가져, 관련 주문의 배열을 채우고 각 orderDetail을 포함한다.

    user.model.findOne()
      .where('email', '***@****.com')
      .populate('orders')
      .exec(function(err, user) {
    
        orderDetail.model.populate(user, 'orders.orderDetails', function(err, results){
    
          // results -> user.orders[].orderDetails[] 
        });
    });
    

    이는 3.8.8에서 잘 작동하지만, 3.6.x.에서 작동합니다

  8. ==============================

    8.이 개념은 깊은 인구입니다. 여기서 일정, 구독, 사용자, 아파트는 다른 수준에서 몽구스 ODM 모델은

    이 개념은 깊은 인구입니다. 여기서 일정, 구독, 사용자, 아파트는 다른 수준에서 몽구스 ODM 모델은

    Calendar.find({}).populate({
          path: 'subscription_id',model: 'Subscription',
             populate: {path: 'user_id',model: 'User',
               populate: {path: 'apartment_id',model: 'Apartment',
                  populate: {path: 'caterer_nonveg_id',
                              model: 'Caterer'}}}}).exec(function(err,data){ 
                              if(!err){
                                 console.log('data all',data)
                               }
                               else{
                                 console.log('err err err',err)
                                }
                       });
    
  9. ==============================

    9.당신이 다 채우기 내부의 채우기를 선택하려면이 방법을 시도해야합니다 :

    당신이 다 채우기 내부의 채우기를 선택하려면이 방법을 시도해야합니다 :

    나는 예약 스키마를 가지고 :

    let Booking = new Schema({
      ...,  // others field of collection
      experience: { type: Schema.Types.ObjectId, ref: 'Experience' },
      ...},{
        collection: 'booking'
      });
    

    및 경험 스키마 :

    let Experience = new Schema({
      ...,
      experienceType: {type: Schema.Types.ObjectId, ref: 'ExperienceType'},
      location: {type: Schema.Types.ObjectId, ref: 'Location'},
      ...} // others field of collection
      ,{
        collection: 'experience'
      });
    

    당신이 예약을 찾을 때 경험 ExperienceType 및 위치 :

    Booking.findOne({_id: req.params.id})
      .populate({path: 'experience',
        populate: [{path: 'experienceType', select: 'name'}, {path: 'location', select: 'name'}],
      })
      .exec((err, booking) => {
        if(err){
          console.log(err);
        }
        else {
          res.json(booking);
        }
      });
    
  10. from https://stackoverflow.com/questions/18867628/mongoose-deep-population-populate-a-populated-field by cc-by-sa and MIT license