我正在开发一个nodejs程序,遇到一个问题,我有一个mongo模式,该模式是对象列表:
players: [{
type: Schema.Types.ObjectId,
ref: 'User'
}]
但是这个参考:'用户'不足以满足我的需求。例如,该“玩家”可以接收对象“用户”或对象“团队”。但是我该怎么声明呢?我应该删除“ ref”参数吗?
一个信息是:如果我在此播放器属性上放置一个“用户”,则不会放置任何其他类型,所有对象都将是用户,“团队”则相同。但是我会在创建对象时知道是团队列表还是用户列表。
那么我该如何声明呢?
谢谢
最佳答案
Mongoose
支持dynamic references。您可以使用String
和refPath
指定类型。看一下documentation提供的模式示例:
var userSchema = new Schema({
name: String,
connections: [{
kind: String,
item: { type: ObjectId, refPath: 'connections.kind' }
}]
});
上面的refPath属性意味着猫鼬会查看
connections.kind路径,用于确定为populate()使用哪个模型。
换句话说,使用refPath属性可以使ref
属性动态。
来自documentation的
populate
调用示例:// 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
});