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

时间:2012-10-07 16:32:56

标签: node.js mongodb mongoose

我在连接到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);

我用这样的命令拉

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加载得很好

5 个答案:

答案 0 :(得分:11)

试试这个

    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
                 });
             });

答案 1 :(得分: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;
         })
})

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

Story.populate(doc.stories, {path: 'creator'}, callback)

但这仍然不起作用:

Story.populate(doc, {path: 'stories.creator'}, callback)

答案 2 :(得分:1)

对@ JohnnyHK的帖子进行跟进,您现在可以在populate()中指定要使用的型号:

https://github.com/LearnBoost/mongoose/issues/1377#issuecomment-15920370

答案 3 :(得分:0)

我的内容略有不同,但使用数组项填充文档。我想知道是否是导致问题的目标。

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({});

答案 4 :(得分:0)

我有几个深层子文档的嵌套层,并没有提供的选项适合我。我发现了这个惊人的Mongoose插件,可以无缝地进行深度人口搜索。你只需要使用与populate一样的语法,但实际上它可以工作。

https://github.com/buunguyen/mongoose-deep-populate

相关问题