我在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
应该处理它。
我错过了什么吗?
答案 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 }