【问题标题】:Why won't my refs populate documents?为什么我的 refs 不会填充文档?
【发布时间】:2016-05-01 06:23:43
【问题描述】:

我在 Node.js 应用程序中使用 Mongoose 4.3.6

比如说,我有两个模型:

var User = mongoose.model('User', SomeParentSchema.extend({
  _id: String,
  name: String
}));

var Like = mongoose.model('Like', AnotherParentSchema.extend({
  _id: String,
  user_id: {
    type: String,
    ref: 'User'
  }
}));

我也在使用mongoose-schema-extend,为了这个问题,我们可以说这两个实体都是从某个父架构扩展而来的。

由于我使用的是ref,理论上Model.populate 应该使用User 模型自动填充字段。

ref 选项告诉 Mongoose 在填充过程中使用哪个模型

Like.findOne({}).populate('user_id').exec(callback);

以上只是永远不会工作。就这么简单(该字段以null 结尾)。我必须这样做才能使其工作:

Like.findOne({}).populate({ path: 'user_id', model: 'User' }).exec(callback);

当我这样做时,该字段是预期的 User 对象(但由于某种原因,我不得不明确告诉 populate 以寻找该路径作为 User 模型;即使 ref 应该根据我上面链接到的 Mongoose 文档来处理这个问题)。

我错过了什么吗?

【问题讨论】:

    标签: node.js mongodb mongoose


    【解决方案1】:

    我只是用下面的代码测试你的示例代码,这个查询Like.findOne({}).populate('user_id').exec(callback); 似乎运行良好。

    架构:

    var PersonSchema = new mongoose.Schema({
        t: String
    }, {collection: 'persons'});
    
    var User = mongoose.model('User', PersonSchema.extend({
      _id: String,
      name: String
    }));
    
    var ParentSchema = new mongoose.Schema({
        s: String
    }, {collection: 'parent'});
    
    var Like = mongoose.model('Like', ParentSchema.extend({
      _id: String,
      user_id: {
        type: String,
        ref: 'User'
      }
    }));
    

    将数据插入数据库,

    var user = new User({
        t: 't1',
        _id: '1234567',
        name: 'test'
    });
    
    var like = new Like({
        s: 's1',
        _id: '23456789',
    });
    
    user.save(function(err, u){
        if(err)
            console.log(err);
        else {
            like.user_id = u._id;
            console.log(like);
            like.save(function(err) {
                if (err)
                    console.log(err);
                else
                    console.log('save like and user....');
            });
        }
    });
    

    查询

    Like.findOne({}).populate('user_id').exec(function(err, doc) {
        if (err)
            console.log(err);
        else
            console.log(doc);
    });
    

    结果是

    { _id: '23456789',
      __t: 'Like',
      user_id: { _id: '1234567', __t: 'User', t: 't1', name: 'test', __v: 0 },
      s: 's1',
      __v: 0 }
    

    【讨论】:

    • 感谢您抽出宝贵时间对此进行测试。我很快会再次查看这个答案,看看我哪里出错了。
    • @zangw 请你帮我解释一下人口问题。我在您的回答中看到此示例中,like 集合包含用户在 user_id 字段中的文档,这有什么帮助。我问了一个关于在这里填充的问题stackoverflow.com/questions/35003893/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-27
    相关资源
    最近更新 更多