让我们假设我有3种模式: 1.用户:
const User = mongoose.model('users', {
name: {
type: String,
required: true,
trim: true
}
}
const SuperUser= mongoose.model('superusers', {
name: {
type: String,
required: true,
trim: true
}
}
const Message = mongoose.model('Message', {
content: {
type: String,
required: true,
trim: true
},
sender: {
type: {
type: mongoose.Schema.Types.String,
required: true,
enum : ['USER,'SUPER_USER'],
},
id: {
type: mongoose.Types.ObjectId,
required: true
}
}
})
我想使用聚合框架来获取(所有)消息,并同时使用表“ superusers”或“ users”(superusers的列)中的数据填充嵌套的发件人对象和用户只是一个例子)。 是否可以“有条件地查找”,即根据类型查找超级用户或用户?我对聚合框架非常陌生,因此这可能是一个显而易见的解决方案。
答案 0 :(得分:0)
是的,使用猫鼬很有可能实现您想要的目标。您可以在定义架构时使用refPath
。并且您的enum
应该是集合名称,即User
,SuperUser
,而不是大写字母。
const Message = mongoose.model('Message', {
content: {
type: String,
required: true,
trim: true
},
sender: {
type: {
type: mongoose.Schema.Types.String,
required: true,
enum : ['User,'SuperUser'],
},
id: {
type: mongoose.Types.ObjectId,
required: true,
refPath : "sender.type"
}
}
})
然后您可以像这样填充文档:
Message.find({}).populate("sender.id");
您的发件人将在sender.id
为简化,您只需将发件人id
存储在sender
字段中,并分别存储senderType
,这样就不必使用{ {1}},用于发送方文档及其更干净的。
sender.id
现在您可以像这样填充文档:
const Message = mongoose.model('Message', {
content: {
type: String,
required: true,
trim: true
},
sender: {
type: mongoose.Types.ObjectId,
required: true,
refPath : "senderType"
},
senderType: {
type: mongoose.Schema.Types.String,
required: true,
enum : ['User,'SuperUser'],
}
})
您的发件人文档/对象将在Message.find({}).populate("sender");
字段中可用
有关详细信息,请阅读Mongoose documentation on dynamic-ref