如何对本地和外部数组字段执行Mongodb$查找

如何对本地和外部数组字段执行Mongodb$查找,mongodb,aggregation-framework,Mongodb,Aggregation Framework,正在尝试对对象中的本地数组字段执行$lookup s 查询案例集合: { "no" : "2020921008981", "sale" : { "soldItems" : [ { "itemId" : "5b55ac7f0550de00210a3b24", }, { "itemId" : "5b55ac7f0550de00215584re",

正在尝试对对象中的本地数组字段执行$lookup s

查询案例集合:

  {
     "no" : "2020921008981",
     "sale" : {
      "soldItems" : [
        {
            "itemId" : "5b55ac7f0550de00210a3b24", 
        },

        {
            "itemId" : "5b55ac7f0550de00215584re", 
        }
      ], 
     "bills" : [
        {
            "billNo" : "2020921053467", 
            "insurancePlanId" : "160", 
        },

        {
            "billNo" : "2020921053467", 
            "insurancePlanId" : "170", 
        }
      ]
    }
  }
{ 
  "_id" : ObjectId("5b55ac7f0550de00210a3b24"), 
  "code" : "ABCDE"
},
{ 
  "_id" : ObjectId("5b55ac7f0550de00215584re"), 
  "code" : "PQRST" 
} 
 { 
   "_id" : ObjectId("5b55aca20550de00210a6d25"), 
   "name" : "HIJKL" 
   "plans" : [
       {
        "_id" : "160", 
        "name" : "UVWZ", 
       }, 
       { 
        "_id" : "161", 
        "name" : "LMNO", 
       }
    ]
  },
 { 
   "_id" : ObjectId("5b55aca20550de00210a6d25"),  
   "name" : "WXYZ"
   "coveragePlans" : [
       {
        "_id" : "169", 
        "name" : "5ABC", 
       }, 
       { 
        "_id" : "170", 
        "name" : "4XYZ", 
       }
    ]
  }
物品收集:

  {
     "no" : "2020921008981",
     "sale" : {
      "soldItems" : [
        {
            "itemId" : "5b55ac7f0550de00210a3b24", 
        },

        {
            "itemId" : "5b55ac7f0550de00215584re", 
        }
      ], 
     "bills" : [
        {
            "billNo" : "2020921053467", 
            "insurancePlanId" : "160", 
        },

        {
            "billNo" : "2020921053467", 
            "insurancePlanId" : "170", 
        }
      ]
    }
  }
{ 
  "_id" : ObjectId("5b55ac7f0550de00210a3b24"), 
  "code" : "ABCDE"
},
{ 
  "_id" : ObjectId("5b55ac7f0550de00215584re"), 
  "code" : "PQRST" 
} 
 { 
   "_id" : ObjectId("5b55aca20550de00210a6d25"), 
   "name" : "HIJKL" 
   "plans" : [
       {
        "_id" : "160", 
        "name" : "UVWZ", 
       }, 
       { 
        "_id" : "161", 
        "name" : "LMNO", 
       }
    ]
  },
 { 
   "_id" : ObjectId("5b55aca20550de00210a6d25"),  
   "name" : "WXYZ"
   "coveragePlans" : [
       {
        "_id" : "169", 
        "name" : "5ABC", 
       }, 
       { 
        "_id" : "170", 
        "name" : "4XYZ", 
       }
    ]
  }
保险托收:

  {
     "no" : "2020921008981",
     "sale" : {
      "soldItems" : [
        {
            "itemId" : "5b55ac7f0550de00210a3b24", 
        },

        {
            "itemId" : "5b55ac7f0550de00215584re", 
        }
      ], 
     "bills" : [
        {
            "billNo" : "2020921053467", 
            "insurancePlanId" : "160", 
        },

        {
            "billNo" : "2020921053467", 
            "insurancePlanId" : "170", 
        }
      ]
    }
  }
{ 
  "_id" : ObjectId("5b55ac7f0550de00210a3b24"), 
  "code" : "ABCDE"
},
{ 
  "_id" : ObjectId("5b55ac7f0550de00215584re"), 
  "code" : "PQRST" 
} 
 { 
   "_id" : ObjectId("5b55aca20550de00210a6d25"), 
   "name" : "HIJKL" 
   "plans" : [
       {
        "_id" : "160", 
        "name" : "UVWZ", 
       }, 
       { 
        "_id" : "161", 
        "name" : "LMNO", 
       }
    ]
  },
 { 
   "_id" : ObjectId("5b55aca20550de00210a6d25"),  
   "name" : "WXYZ"
   "coveragePlans" : [
       {
        "_id" : "169", 
        "name" : "5ABC", 
       }, 
       { 
        "_id" : "170", 
        "name" : "4XYZ", 
       }
    ]
  }
期望输出:

  {
     "no" : "2020921008981",
     "sale" : {}
     "insurances" : "HIJKL \n WXYZ",
     "items" : [
         { 
            "_id" : ObjectId("5b55ac7f0550de00210a3b24"), 
            "code" : "ABCDE"
       },
         { 
            "_id" : ObjectId("5b55ac7f0550de00215584re"), 
            "code" : "PQRST"
       } 
    ]
  }
尝试使用
集合中的本地
itemRefId
字段进行查找。并使用本地
保险计划ID
保险
集合中查找,然后
$reduce
将返回的数组还原为
保险
字段所需的格式:

     {
        $lookup:
            {
                from: "item",
                let:  { iid: "$sale.soldItems.itemId" },
                pipeline: [
                      {
                        $match: {
                            $expr: {
                                $in: ["$_id", {
                                    $map: {
                                        input: "$$iid",
                                        in: { $_id: "$$this" }
                                    }
                                }
                                ]
                            }
                        }
                    }
                ],
                as: "items"
            }
    }, 
  {
        $lookup:
            {
                from: "insurance",
                let:  { iid: "$sale.insurances.insurancePlanId" },
                pipeline: [
                      {
                        $match: {
                            $expr: {
                                $in: ["$insurance.plans._id", {
                                    $map: {
                                        input: "$$iid",
                                        in: { $toObjectId: "$$this" }
                                    }
                                }
                                ]
                            }
                        }
                    }
                ],
                as: "insurancesList"
            }
    }, 
   {
    $addFields: {
        insurances: {
            $reduce: {
                input: "$insurancesList.name",
                initialValue: "",
                in: {
                    $cond: [ { "$eq": [ "$$value", "" ] }, "$$this", { $concat: [ "$$value", "\n", "$$this" ] } ]
                }
            }
        }
    }
}
此尝试返回mongodb错误。任何有助于获得所需输出的帮助都将不胜感激

db.case.aggregate([
{
$lookup:{
来自:“保险”,
let:{IPID:$salesOrder.invoices.insurancePlanId},
管道:[
{
$unwind:“$Coverage计划”
},
{
$match:{$expr:{$in:[“$coverageplan.\u id”,“$$ipid”]}
},
{
$project:{u id:0,名称:1}
}
],
as:“保险”
}
},
{
$lookup:{
从:“物品”,
let:{iid:$salesOrder.purchaseItems.itemRefId},
管道:[
{
$match:{
$expr:{
$in:[“$\u id”{
$map:{
输入:“$$iid”,
在:{$toObjectId:$$this}
}
}
]
}
}
}
],
as:“项目”
}
},
{
$项目:{
_id:0,
案件编号:1,
保险:{
美元减少:{
输入:“$insurances”,
初始值:“”,
在:{$concat:[“$$value”、“$$this.name”、“\n”]}
}
},
项目:1
}
}
])

有没有办法用这种方式将numberprint格式的值串联起来?@dineshalwis不确定,伙计,试试看。如果不起作用,请先用$toString转换。我们如何对此查询执行空检查?因为im获取
$in需要一个数组作为第二个参数,所以对于某些记录,找到了:null