Подтвердить что ты не робот

Не удается получить массив 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 загружается только отлично

4b9b3361

Ответ 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)

Ответ 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