无法获取Mongoose.js Subdocument Array来填充

chr*_*awn 13 mongoose mongodb node.js

我在连接到mongodb的node.js服务器上使用mongoose.js,我有一个像下面这样的猫鼬模型

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);
Run Code Online (Sandbox Code Playgroud)

我用这样的命令拉

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?
});
Run Code Online (Sandbox Code Playgroud)

我的问题是我不能让subs.members数组填充甚至加载,它只是显示为一个空数组.

即使subs._member加载得很好,我也尝试过.populate("subs.members")无济于事

小智 13

试试这个

    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
                 });
             });
Run Code Online (Sandbox Code Playgroud)


Wum*_*mms 7

@leesei:我不能评论你的帖子(代表太少),所以我把它作为一个单独的答案.

在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;
         })
})
Run Code Online (Sandbox Code Playgroud)

在上面的解决方案中,这有效:

Story.populate(doc.stories, {path: 'creator'}, callback)
Run Code Online (Sandbox Code Playgroud)

但这仍然行不通:

Story.populate(doc, {path: 'stories.creator'}, callback)
Run Code Online (Sandbox Code Playgroud)