如何在mongodb中应用带条件的$lookup?

如何在mongodb中应用带条件的$lookup?,mongodb,mongoose,nosql,aggregation-framework,lookup,Mongodb,Mongoose,Nosql,Aggregation Framework,Lookup,我正在使用mongodb数据库,希望在2个collections上应用$lookup,但有特定条件。 我有一个collection像这样命名为Company new Schema({ name: String, benefit: String, benefitDesc: String, company_url: String, logoUrl: String, coverUrl: String, desc: String, crea

我正在使用
mongodb
数据库,希望在2个
collections
上应用
$lookup
,但有特定条件。 我有一个
collection
像这样命名为
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' },
})
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' }
})
[
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  .....
]
还有另一个名为
Referrallinks
collection
如下

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' },
})
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' }
})
[
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  .....
]
现在,当我应用此
$lookup

Company.aggregate([{
    $lookup: {
        from: 'referrallinks',
        localField: '_id',
        foreignField: 'companyId',
        as: 'referrals'
    }
}])
因此,我得到了所有公司的
推荐
作为
数组
如下

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' },
})
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' }
})
[
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  {name : '', benefit : '', benefiDesc : '', referrals : []},
  .....
]
但我只希望在每个
公司的
转介
数组中有
链接状态
已批准
的转介

**注意:**我还希望将
类别
对象与
公司
关联,并尝试了此聚合,但它给出了错误信息

{
  from: "referrallinks",
  let: { company_id: "$_id" },
  pipeline: [{
    $match: {
      $expr: {
       $and: [
        { $eq: [ "$$company_id", "$companyId" ] },
        { $eq: [ "$link_status", "Approved" ] }
       ]
     }
    },
  {
    $lookup : {
    from : "categories",
    let  : {"category_id" : "$categoryId"},
    pipeline : [
      {
        $match : {
          $expr : {
            $eq : ["category_id","$_id"]
          }
        }
      }
    ],
    as : "company"
   }
  }
 }],
 as: "referrals"
}
如何实现此目的?

用于指定其他过滤条件:

Company.aggregate([{
    $lookup: {
        from: "referrallinks",
        let: { company_id: "$_id" },
        pipeline: [{
            $match: {
                $expr: {
                    $and: [
                        { $eq: [ "$$company_id", "$companyId" ] },
                        { $eq: [ "$link_status", "Approved" ] }
                    ]
                }
            }
        }],
        as: "referrals"
    }
}])
编辑:要运行嵌套的
$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: "company"
                }
            }
        ],
        as: "referrals"
    }
}])
用于指定其他过滤条件:

Company.aggregate([{
    $lookup: {
        from: "referrallinks",
        let: { company_id: "$_id" },
        pipeline: [{
            $match: {
                $expr: {
                    $and: [
                        { $eq: [ "$$company_id", "$companyId" ] },
                        { $eq: [ "$link_status", "Approved" ] }
                    ]
                }
            }
        }],
        as: "referrals"
    }
}])
编辑:要运行嵌套的
$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: "company"
                }
            }
        ],
        as: "referrals"
    }
}])

您的查询中有一些错误。请参见此处的错误@ahsan ah yes,
$expr
丢失,请再试一次。我有
$lookup
填充
?就像我有
companyId
作为
category
集合的(ObjectId)一样,我想在我的结果中也有
category
。@ahsan afair在这种情况下你必须继续使用
$lookup
,我试过了,但没有运气。您能修改您的答案吗?您的查询中有一些错误。请参见此处的错误@ahsan ah yes,
$expr
丢失,请再试一次。我有
$lookup
填充
?就像我有
companyId
作为
category
集合的(ObjectId)一样,我想在我的结果中也有
category
。@ahsan afair在这种情况下你必须继续使用
$lookup
,我试过了,但没有运气。你能修改你的答案吗?