【问题标题】:How can i get the referenced dcoument as nested document with $lookup in Mongodb?如何在 Mongodb 中使用 $lookup 将引用的文档作为嵌套文档获取?
【发布时间】:2020-05-11 06:42:17
【问题描述】:

我正在使用 mongodb 数据库并希望在 2 collections 上应用 $lookup 但有特定条件。我有一个名为 Company 的集合,像这样

new Schema({
name: String,
benefit: String,
benefitDesc: String,
company_url: String,
logoUrl: String,
coverUrl: String,
desc: String,
createdAt: String,
categoryId: { type: Schema.Types.ObjectId, ref: 'categories' },
})

还有一个类似这样的名为 Referrallinks 的集合

new Schema({
referral_link: String,
referral_code: String,
isLink: Number,
offer_name: String,
offer_desc: String,
user_email: String,
companyId: { type: Schema.Types.ObjectId, ref: 'companies' },
addedByAdmin: { type: Boolean, default: true },
number_of_clicks: Number,
referral_country: String,
link_status: String,
categoryId: { type: Schema.Types.ObjectId, ref: 'categories' },
number_of_clicks: { type: Number, default: 0 },
createdAt: String,
 updatedAt: String,
 userId: { type: Schema.Types.ObjectId, ref: 'users' }
})

现在当我应用这个$lookup 查询时

Company.aggregate([{
    $lookup: {
        from: "referrallinks",
        let: { company_id: "$_id" },
        pipeline: [{
                $match: {
                    $expr: {
                        $and: [
                            { $eq: ["$$company_id", "$companyId"] },
                            { $eq: ["$link_status", "Approved"] }
                        ]
                    }
                }
            },
            {
                $lookup: {
                    from: "categories",
                    localField: "categoryId",
                    foreignField: "_id",
                    as: "category"
                }
            }
        ],
        as: "referrals"
    }
}])

所以我在每个公司的referral 对象的key 中获取category 对象。但我希望它在 referral 这样的对象之外

[
 {name : '', benefit : '', benefiDesc : '', referrals : [], category : {}},
 {name : '', benefit : '', benefiDesc : '', referrals : [], category : {}},
 {name : '', benefit : '', benefiDesc : '', referrals : [], category : {}},
 .....
]  

我该怎么做?

【问题讨论】:

    标签: mongodb mongoose lookup


    【解决方案1】:

    您只需将嵌套的$lookup 移出第一个并作为单独的管道步骤运行:

    Company.aggregate([
        {
            $lookup: {
                from: "referrallinks",
                let: { company_id: "$_id" },
                pipeline: [{
                    $match: {
                        $expr: {
                            $and: [
                                { $eq: [ "$$company_id", "$companyId" ] },
                                { $eq: [ "$link_status", "Approved" ] }
                            ]
                        }
                    }
                }],
                as: "referrals"
            }
        },
        {
            $lookup: {
                from: "categories",
                localField: "referrals.categoryId",
                foreignField: "_id",
                as: "categories"
            }
        }
    ])
    

    请注意,referrals.categoryId 的计算结果为 ObjectId 值数组

    Mongo Playground

    【讨论】:

      猜你喜欢
      • 2019-03-20
      • 1970-01-01
      • 2019-04-29
      • 1970-01-01
      • 2020-12-29
      • 2020-11-26
      • 2020-12-31
      • 2020-10-04
      • 1970-01-01
      相关资源
      最近更新 更多