2017-07-14 65 views
1

我发展一个的NodeJS程序,我面临的一个问题,我有一个蒙戈架构是对象的列表:如何创建节点JS MongoDB的动态参考

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

但这REF:“用户'不足以满足我的需求。例如,这个“玩家”有可能接收对象“用户”或对象“团队”。但我该如何申报?我应该删除“ref”参数吗?一个信息是:如果我把一个“用户”放在这个玩家属性上,我不会放任何其他类型,所有对象都会是用户,对于“团队”来说也是一样的。但是我会知道在我创建对象的时候是否会列出团队或用户列表。

那么我该如何申报呢?

谢谢

回答

0

Mongoose支持dynamic references。您使用StringrefPath指定类型。在由documentation提供的模式的例子来看一看:

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

的refPath属性以上意味着猫鼬将着眼于 connections.kind路径,以确定要用于填入哪个模型()。 换句话说,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 
    });