是否可以(有条件地)从两个不同的集合中查找

时间:2019-06-14 06:17:38

标签: mongodb mongoose aggregation-framework

让我们假设我有3种模式: 1.用户:

const User = mongoose.model('users', {
    name: {
        type: String,
        required: true,
        trim: true
    }
}
  1. 超级用户:
const SuperUser= mongoose.model('superusers', {
    name: {
        type: String,
        required: true,
        trim: true
    }
}
  1. 消息:
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的列)中的数据填充嵌套的发件人对象和用户只是一个例子)。 是否可以“有条件地查找”,即根据类型查找超级用户或用户?我对聚合框架非常陌生,因此这可能是一个显而易见的解决方案。

1 个答案:

答案 0 :(得分:0)

是的,使用猫鼬很有可能实现您想要的目标。您可以在定义架构时使用refPath。并且您的enum应该是集合名称,即UserSuperUser,而不是大写字母。

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