16

我在连接到 mongodb 的 node.js 服务器上使用 mongoose.js,我有一个如下所示的 mongoose 模型

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

4

5 回答 5

16

试试这个

    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
                 });
             });
于 2014-01-24T14:28:00.367 回答
7

@leesei:我无法评论您的帖子(代表太少),所以我将其作为单独的答案。

在 mongoose 3.6 subdoc 中仍然无法正常工作,问题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)
于 2013-10-23T01:22:40.013 回答
1

跟进@JohnnyHK 的帖子,您可以指定暂时使用的模型populate()

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

于 2013-06-19T04:12:55.677 回答
0

我有几个嵌套层深的子文档,并且提供的选项都不适合我。我发现了这个神奇的 Mongoose 插件,它可以无缝地进行深度填充。您只需使用您希望使用 populate 的相同语法,但它确实有效。

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

于 2016-11-17T19:16:53.113 回答
-1

我有一些看起来略有不同但使用数组项填充文档的东西。我想知道是否是导致问题的对象。

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({});
于 2012-10-08T19:50:07.353 回答