【问题标题】:Is it possible to (conditionally) lookup from two different collections是否可以(有条件地)从两个不同的集合中查找
【发布时间】:2019-10-28 18:04:48
【问题描述】:

假设我有 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
        }
    }
})

我想使用聚合框架来获取(所有)消息,同时在消息内部使用“超级用户”或“用户”表(超级用户的列)中的数据填充嵌套的发件人对象和用户只是一个例子)。 是否可以“有条件地查找”,即根据类型查找超级用户或用户?我对聚合框架很陌生,所以这可能是一个显而易见的解决方案。

【问题讨论】:

    标签: mongodb mongoose aggregation-framework


    【解决方案1】:

    是的,猫鼬很可能实现您想要实现的目标。您可以在定义架构时使用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 中可用

    为简化,您可以简单地将sender id存储在sender字段中,并将senderType单独存储,这样您就不必为sender文档使用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");
    

    您的发件人文档/对象将在sender 字段中可用

    详情请阅读Mongoose documentation on dynamic-ref

    【讨论】:

    • 我有同样的 refPath 用例。它对我不起作用。
    猜你喜欢
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-07
    • 2018-10-02
    • 2012-04-07
    相关资源
    最近更新 更多