我有一个mongoose架构User
和一个字段friends
,它再次引用User
架构,如下所示:
var UserSchema = new Schema({
name: String,
email: { type: String, lowercase: true },
role: {
type: String,
default: 'user'
},
friends: [{ type: Schema.Types.ObjectId, ref: 'User'}]
});
这很好用,我可以在设置这些用户ID之后看到数据库中的用户ID:
var test = new User({...});
var admin = new User({...});
var users = [test, admin];
User.find({}).remove(function () {
User.create(users, function () {
console.log('finished populating users');
});
});
但是现在我想在获取单个用户时填充friends
字段,就像在文档中一样,我这样做:
exports.show = function (req, res, next) {
var userId = req.params.id;
User.findById(userId)
.populate('friends')
.exec(function (err, user) {
if (err) return next(err);
if (!user) return res.send(401);
res.json(user.profile);
});
};
但我只是回到正常/未填充的用户ID !!
我感觉这是因为用户架构的自引用,但ID在数据库中显得很好......
建议的副本对我没有帮助,因为我甚至没有使用那么多的嵌套,问题可能只是模式的自引用!
有什么想法吗?提前谢谢!
答案 0 :(得分:1)
好的,我发现了问题所在。 user.profile
是来自Mongoose的虚拟架构。所以我扩展了:
UserSchema
.virtual('profile')
.get(function() {
return {
'_id': this._id,
'name': this.name,
'role': this.role,
'friends': this.friends
};
});
现在填充friends
有效!
答案 1 :(得分:0)
User.findById(userId)
.populate('friends', ['name', 'email'])
.exec(function (err, user) {
if (err) return next(err);
if (!user) return res.send(401);
res.json(user.profile);
});
尝试仅使用必填字段(不包括“朋友”字段)填充朋友,以避免模式的自引用。