Как выполнить поиск Mongodb $ для локальных и внешних полей массива - PullRequest
2 голосов
/ 12 апреля 2020

Попытка выполнить поиск в $ для полей локального массива, который находится внутри объекта.

Коллекция запросов:

  {
     "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 из коллекции item. И поиск с использованием локального insurancePlanId из коллекции insurance и затем $reduce возвращаемого массива в нужном формате для поля insurances:

     {
        $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. Любая помощь, чтобы получить желаемый результат будет принята с благодарностью.

1 Ответ

0 голосов
/ 12 апреля 2020
db.case.aggregate([
    {
        $lookup: {
            from: "insurance",
            let: { ipids: "$salesOrder.invoices.insurancePlanId" },
            pipeline: [
                {
                    $unwind: "$coveragePlans"
                },
                {
                    $match: { $expr: { $in: ["$coveragePlans._id", "$$ipids"] } }
                },
                {
                    $project: { _id: 0, name: 1 }
                }
            ],
            as: "insurances"
        }
    },
    {
        $lookup: {
            from: "item",
            let: { iid: "$salesOrder.purchaseItems.itemRefId" },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $in: ["$_id", {
                                $map: {
                                    input: "$$iid",
                                    in: { $toObjectId: "$$this" }
                                }
                            }
                            ]
                        }
                    }
                }
            ],
            as: "items"
        }
    },
    {
        $project: {
            _id: 0,
            caseNumber: 1,
            insurances: {
                $reduce: {
                    input: "$insurances",
                    initialValue: "",
                    in: { $concat: ["$$value", "$$this.name", " \n "] }
                }
            },
            items: 1
        }
    }
])
...