我正在开发一个nodejs程序,遇到一个问题,我有一个mongo模式,该模式是对象列表:

players: [{
    type: Schema.Types.ObjectId,
    ref: 'User'
  }]


但是这个参考:'用户'不足以满足我的需求。例如,该“玩家”可以接收对象“用户”或对象“团队”。但是我该怎么声明呢?我应该删除“ ref”参数吗?

一个信息是:如果我在此播放器属性上放置一个“用户”,则不会放置任何其他类型,所有对象都将是用户,“团队”则相同。但是我会在创建对象时知道是团队列表还是用户列表。

那么我该如何声明呢?

谢谢

最佳答案

Mongoose支持dynamic references。您可以使用StringrefPath指定类型。看一下documentation提供的模式示例:

var userSchema = new Schema({
  name: String,
  connections: [{
    kind: String,
    item: { type: ObjectId, refPath: 'connections.kind' }
  }]
});



  上面的refPath属性意味着猫鼬会查看
  connections.kind路径,用于确定为populate()使用哪个模型。
  换句话说,使用refPath属性可以使ref
  属性动态。


来自documentationpopulate调用示例:

// Say we have one organization:
// `{ _id: ObjectId('000000000000000000000001'), name: "Guns N' Roses", kind: 'Band' }`
// And two users:
// {
//   _id: ObjectId('000000000000000000000002')
//   name: 'Axl Rose',
//   connections: [
//     { kind: 'User', item: ObjectId('000000000000000000000003') },
//     { kind: 'Organization', item: ObjectId('000000000000000000000001') }
//   ]
// },
// {
//   _id: ObjectId('000000000000000000000003')
//   name: 'Slash',
//   connections: []
// }

User.
  findOne({ name: 'Axl Rose' }).
  populate('connections.item').
  exec(function(error, doc) {
    // doc.connections[0].item is a User doc
    // doc.connections[1].item is an Organization doc
  });

09-25 19:01