如何手动填充?

How to manually populate?

我有一个架构 Session:

Session: {
  _user: { type: mongoose.Schema.ObjectId, ref: 'User' }
}

我有一个创建会话的函数,我需要 session._user 进行填充。我的函数将用户作为第一个参数,所以我想 session._user = user; 但这不起作用。 这是一个简化的片段:

function createSession(user, callback) {
  return Session.create({
    _user: user.id
  }, function(err, session) {
    // session._user = user; does not work
    // return callback(null, session);

    // Workaround
    return session.populate('_user', function(err, session) {
      return callback(null, session);
    });
};

如果您想像 session 一样自行填充 Mongoose 模型实例,您必须首先通过调用 toObject() 将其转换为普通 JS 对象,否则模式类型检查将阻止它工作:

function createSession(user, callback) {
  return Session.create({
    _user: user.id
  }, function(err, session) {
    session = session.toObject();
    session._user = user;
    return callback(null, session);
};

Mongoose 4.0 现已提供该功能。
启动该功能的问题:https://github.com/Automattic/mongoose/issues/2075 and the issue for the documentation: https://github.com/Automattic/mongoose/issues/2884.