[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.몽구스는 이제 깊은 협회를위한 새로운 방법 Model.populate있다 :
몽구스는 이제 깊은 협회를위한 새로운 방법 Model.populate있다 :
https://github.com/Automattic/mongoose/issues/1377#issuecomment-15911192
-
==============================
2.첫째, 업데이트 4 3 몽구스 및 다음 아래로 몽구스 깊은 인구 간단한 방법을 사용합니다 :
첫째, 업데이트 4 3 몽구스 및 다음 아래로 몽구스 깊은 인구 간단한 방법을 사용합니다 :
당신은 당신이 스키마 검토 용 아이디 심판 일부 리뷰가 사용자의 아이디 심판 및 다음과 같이 사용자 ID 가진 블로그 스키마가 있다고 가정. 그래서 기본적으로 세 가지 스키마를 가지고 : 1. 블로그 2. 사용자 3. 검토
그리고, 당신은 사용자가이 블로그 및 사용자 리뷰를 소유 블로그에서 쿼리에 있습니다. 당신은 당신의 결과로 조회 할 수 있습니다 :
BlogModel .find({}) .populate({ path : 'userId', populate : { path : 'reviewId' } }) .exec(function (err, res) { })
-
==============================
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.너무 조금 늦게 될 수도 있지만 나는 몽구스는 임의의 중첩 수준에서 깊은 채우기를 수행하는 플러그인 썼다. 이 플러그인은 등록하면 카테고리의 기사를 채우고 단지 하나의 선으로 계정 수 :
너무 조금 늦게 될 수도 있지만 나는 몽구스는 임의의 중첩 수준에서 깊은 채우기를 수행하는 플러그인 썼다. 이 플러그인은 등록하면 카테고리의 기사를 채우고 단지 하나의 선으로 계정 수 :
Category.deepPopulate(categories, 'articles.account', cb)
당신은 또한 선택 ... 각각의 인구가 경로, 제한 등의 제어 것들로 채우기 옵션을 지정할 수 있습니다. 자세한 내용은 플러그인 설명서를 체크 아웃.
-
==============================
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.죄송합니다 귀하의 거품 파열,하지만 직접 지원 솔루션이 거기 아니에요합니다. Github에서의 문제점 # 601에 관해서는, 그것은 잔인한 보인다. 개발자가 문제가 수동 재귀 / 깊은 인구에 만족 인정 같은 3.6 릴리스 노트에 따르면, 그것은 보인다.
죄송합니다 귀하의 거품 파열,하지만 직접 지원 솔루션이 거기 아니에요합니다. Github에서의 문제점 # 601에 관해서는, 그것은 잔인한 보인다. 개발자가 문제가 수동 재귀 / 깊은 인구에 만족 인정 같은 3.6 릴리스 노트에 따르면, 그것은 보인다.
그래서 릴리스 노트에서 권장되는 방법은 응답을 보내기 전에 더 채우기 위해 사용 categories.populate, 그래서 당신의 간부 인 () 함수에서 콜백 둥지 채워 호출하는 것입니다.
-
==============================
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.이 개념은 깊은 인구입니다. 여기서 일정, 구독, 사용자, 아파트는 다른 수준에서 몽구스 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.당신이 다 채우기 내부의 채우기를 선택하려면이 방법을 시도해야합니다 :
당신이 다 채우기 내부의 채우기를 선택하려면이 방법을 시도해야합니다 :
나는 예약 스키마를 가지고 :
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); } });
from https://stackoverflow.com/questions/18867628/mongoose-deep-population-populate-a-populated-field by cc-by-sa and MIT license
'MONGODB' 카테고리의 다른 글
[MONGODB] MongoDB를에 findOne를 사용하면 최대 ID를 가진 요소를 얻을 수 (0) | 2019.12.13 |
---|---|
[MONGODB] 문서에서 일부 필드를 제외하는 방법 (0) | 2019.12.13 |
[MONGODB] 몽고에 인증 할 수 없습니다 "인증 실패" (0) | 2019.12.13 |
[MONGODB] 어떻게 다른 하나 개의 MongoDB를 서버에서 데이터베이스를 복사합니까? (0) | 2019.12.13 |
[MONGODB] DBRef와 MongoDB를를 조회하는 방법 (0) | 2019.12.13 |