Mongoose填充对自己Schema的引用

时间:2015-06-24 15:33:28

标签: node.js mongodb mongoose

我有一个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在数据库中显得很好......

建议的副本对我没有帮助,因为我甚至没有使用那么多的嵌套,问题可能只是模式的自引用

有什么想法吗?提前谢谢!

2 个答案:

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

尝试仅使用必填字段(不包括“朋友”字段)填充朋友,以避免模式的自引用。