【问题标题】:Can't get Mongoose.js Subdocument Array to populate无法让 Mongoose.js 子文档数组填充
【发布时间】:2012-09-28 01:14:46
【问题描述】:

我在连接到 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 加载得很好

【问题讨论】:

标签: node.js mongodb mongoose


【解决方案1】:

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

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

【讨论】:

  • 我改变了我的例子。希望对您有所帮助。
  • 是的,这个例子仍然不那么复杂..我在主模式上的数组总是填充得很好..子模式数组上的数组是永远不会填充的数组......我不这么认为是 objectid,因为不在数组中的子项上的 objectid ref 填充得很好
  • 啊。明白了。您的成员架构是什么样的?
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    @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)
    

    【讨论】:

      【解决方案4】:

      试试这个

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

      【讨论】:

      • 工作,最完整的答案.. 并且确实需要猫鼬团队的错误修复和解决方法才能达到这一点,尽管原始问题从未得到解决.. 有人确实想出了一个解决方法它也能正常工作...gist.github.com/joeytwiddle/6129676
      【解决方案5】:

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

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

      【讨论】:

        猜你喜欢
        • 2017-03-21
        • 2017-06-06
        • 2013-08-30
        • 2016-03-03
        • 2020-12-18
        • 2014-11-03
        • 2017-09-25
        • 2021-08-29
        • 2014-08-16
        相关资源
        最近更新 更多