몽구스: 인구밀집(인구밀집지)
있습니다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로 리뷰가 있다고 가정합니다.기본적으로 세 가지 스키마가 있습니다.
- 블로그
- 사용자
- 검토
또한 블로그에서 이 블로그와 사용자 리뷰를 소유한 사용자를 조회해야 합니다.따라서 다음과 같이 결과를 조회할 수 있습니다.
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
'programing' 카테고리의 다른 글
jJSON을 문자열로 쿼리하시겠습니까? (0) | 2023.03.27 |
---|---|
ng-class에서 이것은 어떤 angularjs 식 구문입니까? (0) | 2023.03.27 |
C#이 있는 MongoDB GridFs, 이미지 등의 파일을 저장하는 방법 (0) | 2023.03.27 |
md-toolbar에서 요소를 오른쪽에 배치하는 방법 (0) | 2023.03.27 |
HTTP 기본 인증을 위한 순수 JavaScript 코드입니까? (0) | 2023.03.27 |