programing

몽구스: 인구밀집(인구밀집지)

muds 2023. 3. 27. 21:44
반응형

몽구스: 인구밀집(인구밀집지)

있습니다Category모델:

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

기사 모델에 참조가 포함되어 있습니다.Account model.

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

즉, 탑재되어 있는articles카테고리 모델은 다음과 같습니다.

{ //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

여기서 논의된 거 알아: 몽구스: 입력된 필드를 채웠지만 실제 솔루션을 찾을 수 없습니다.

먼저 mongoose 3을 4로 업데이트한 후 아래와 같이 mongoose의 심층 개체군을 위한 가장 간단한 방법을 사용합니다.

예를 들어 블로그 스키마가 userId를 refId로 하고 User에서 스키마 리뷰의 refId로 리뷰가 있다고 가정합니다.기본적으로 세 가지 스키마가 있습니다.

  1. 블로그
  2. 사용자
  3. 검토

또한 블로그에서 이 블로그와 사용자 리뷰를 소유한 사용자를 조회해야 합니다.따라서 다음과 같이 결과를 조회할 수 있습니다.

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

  })

여러 레벨에 걸쳐 입력

사용자의 친구를 추적하는 사용자 스키마가 있다고 가정합니다.

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

채우기를 사용하면 사용자의 친구 목록을 얻을 수 있지만 사용자의 친구 친구도 원할 경우 어떻게 해야 합니까?mongoose에게 모든 사용자 친구의 친구 배열을 채우도록 지시하는 채우기 옵션을 지정합니다.

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

몽구스는 이제 새로운 방법을 가지고 있다.Model.populate깊은 연관성의 경우:

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

조금 늦었을지도 모르지만, 임의의 네스트 레벨에서 딥 인플루먼트를 실행하기 위해서 Mongoose 플러그인을 작성했습니다.이 플러그인을 등록하면 카테고리의 기사 및 계정을 한 줄로 채울 수 있습니다.

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

또한 다음과 같은 항목을 제어하기 위한 채우기 옵션을 지정할 수 있습니다.limit,select...가 입력된 각 경로에 적용됩니다.자세한 것은, 플러그 인의 메뉴얼을 참조해 주세요.

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

또는 다음과 같이 개체를 채우기 메서드에 전달할 수 있습니다.

const myFilterObj = {};
const populateObj = {
                path: "parentFileds",
                populate: {
                    path: "childFileds",
                    select: "childFiledsToSelect"
                },
                select: "parentFiledsToSelect"
               };
Model.find(myFilterObj)
     .populate(populateObj).exec((err, data) => console.log(data) );

이 개념은 심층 인구입니다.여기서는 Calendar, Subscription, User, Apartment는 다양한 레벨의 Mongoose 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)
                            }
                   });

버블을 깨서 죄송합니다만, 이에 대한 직접적인 지원 솔루션은 없습니다.Github #601에 대해서는 암울해 보인다.3.6 릴리스 노트에 따르면 개발자들은 수동 재귀적/심층 인구에 문제가 있다는 것을 인정한 것으로 보입니다.

입니다.콜백이 포함되어 있습니다.이렇게 하면 콜백은exec(),, " "categories.populate응답을 전송하기 전에 추가 정보를 입력합니다.

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라는 질문에서 영감을 얻어 두 가지 수준의 많은 관계를 채웁니다. 번째로 「」를 합니다.user 있는 .order, 을 포함합니다.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 ,, 서, 서, 서, 에, 에, 니, 니, 니, but, but, but, but3.6.x.

multiple inside pulpul을 선택하려면 다음과 같이 하십시오.

예약 스키마가 있습니다.

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

예약을 찾으면 경험 유형위치 확인:

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

언급URL : https://stackoverflow.com/questions/18867628/mongoose-deep-population-populate-a-populated-field

반응형