Не удается получить массив Subdocument Mongoose.js для заполнения
Я использую mongoose.js на сервере node.js, подключающемся к mongodb и
У меня есть модель мангуста, как показано ниже.
SubSchema = new Schema({
_member: {type: ObjectId, ref: 'Member'},
members: [{type: ObjectId, ref: 'Member'}],
created: { type: Date, default: Date.now }
});
mongoose.model('SubModel', SubSchema);
MainSchema = new Schema({
_member: {type: ObjectId, ref: 'Member'},
subs: [SubSchema],
members: [{type: ObjectId, ref: 'Member'}],
created: { type: Date, default: Date.now }
});
var MainModel mongoose.model('MainModel', MainSchema);
который я вытаскиваю с помощью такой команды
var q = MainModel.find({})
.sort('created', -1)
.limit(25)
.populate("_member")
.populate("subs._member")
.populate("subs.members");
q.execFind(function(err, mains){
//mains[0].subs[0].members - will always be empty why?
});
Моя проблема в том, что я не могу получить массив subs.members для заполнения или даже загрузки, он просто продолжает показывать как пустой массив.
Я пробовал .populate( "subs.members" ) безрезультатно, хотя subs._member загружается только отлично
Ответы
Ответ 1
попробуйте это
SubSchema = new Schema({
_member: {type: ObjectId, ref: 'Member'},
members: [{type: ObjectId, ref: 'Member'}],
created: { type: Date, default: Date.now }
});
var SubModel = mongoose.model('SubModel', SubSchema);//add
MainSchema = new Schema({
_member: {type: ObjectId, ref: 'Member'},
subs: [SubSchema],
members: [{type: ObjectId, ref: 'Member'}],
created: { type: Date, default: Date.now }
});
var MainModel = mongoose.model('MainModel', MainSchema);
MainModel.find({})
.sort('created', -1)
.limit(25)
.populate("_member")
.populate("subs._member")
.exec(function(err, mains){
//add
SubModel.populate(mains,{
path:'subs.members'
},function(err,mains){
//mains[0].subs[0].members - is not empty
});
});
Ответ 2
@leesei: Я не могу комментировать ваш пост (слишком мало rep), поэтому я оставляю это как отдельный ответ.
В mongoose 3,6 подгруппы населения до сих пор не работают, проблема github.com/LearnBoost/mongoose/issues/1381 была закрыта 7 месяцев назад со следующим решением в качестве обходного пути. Мне пришлось немного изменить его, чтобы объединить заполненный поддомен обратно в основной документ.
Поддокументальная модель Story
должна быть явно указана:
Person.findById(user1._id).populate("stories")
.exec(function(err, doc {
Story.populate(doc.stories, {path: 'creator'}, function (err, stories) {
doc.stories = stories;
return doc;
})
})
В решении выше это работает:
Story.populate(doc.stories, {path: 'creator'}, callback)
но это все равно не сработает:
Story.populate(doc, {path: 'stories.creator'}, callback)
Ответ 3
Последующее наблюдение за сообщением @JohnnyHK, вы можете указать модель для использования в populate()
:
https://github.com/LearnBoost/mongoose/issues/1377#issuecomment-15920370
Ответ 4
У меня есть нечто, что выглядит несколько иначе, но заполняет документ элементами массива. Мне интересно, вызывает ли это объект, который вызывает проблемы.
var mongoose = require('mongoose');
var Schema = mongoose.Schema, ObjectID = Schema.ObjectId;
var SubSchema = new Schema({
testsub: String,
created: { type: Date, default: Date.now }
});
var MainSchema = new Schema({
test: String
subs: [SubSchema],
created: { type: Date, default: Date.now }
});
mongoose.model('MainSchema', MainSchema, mainschema);
var query = MainSchema.find({});
Ответ 5
У меня было несколько слоев гнезда в глубину субдокументов, и ни один из предоставленных параметров не работал у меня. Я нашел этот удивительный плагин Mongoose, который будет делать глубокое население без проблем. Вы просто используете тот же синтаксис, который вы ожидаете работать с заполнением, но он действительно работает.
https://github.com/buunguyen/mongoose-deep-populate