为什么我的参考文件没有填充文件?

时间:2016-01-25 02:23:56

标签: node.js mongodb mongoose

我在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模型查找;即使根据我上面提到的Mongoose文档,ref应该处理它。

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我只是按照以下方式测试您的示例代码,此查询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 }