聚合:保留mongodb中先前聚合管道中的值

时间:2020-02-29 08:48:09

标签: mongodb mongoose aggregation-framework

嗨,我们如何保留先前聚合管道中的值。假设我有多个集合,在这种情况下假设有3个集合。每个集合中可能有超过1000个文档

///collection 1: collection1///
 {
    "_id" : ObjectId("5e58b69b76e00159b4dfd286"),
    "name" : "Dean"
    "type" : ["app"],
    "city" : "cityA1",
 }
 ///collection 2: collection2///
{
     "_id" : ObjectId("5e1efac668c3c811c83263cc"),
      "code" : "A001",
      "day" : "sunday",
      "city" : "cityA1",
      "status":"active"
   },
 {
     "_id" : ObjectId("5e1efac668c3c811c83265fb"),
      "Code" : "A002",
      "day" : "sunday",
      "city" : "cityA1",
   },
 ///collection 3: collection3///  
{
    "_id" : ObjectId("5e58b69b76e00159b4dfd286"),
    "collection1_Id":ObjectId("5e58b69b76e00159b4dfd286")
    "handleCount" : 34,
    "code" : "A001",
  },
 {
    "_id" : ObjectId("5e58b69b76e00159b4dfd286"),
    "collection1_Id":ObjectId("5e58b69b76e00159b4dff345")
   "code" : "A001",
   }  

现在是查询

  db.collection1.aggregate([
    {
        '$match': {
            status: 'active',
        }
    },
    {
        $lookup: {
            from: "collection2",
            let: {
                city: "$city",

            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ["$city", "$$city"]
                        }
                    }
                }
            ], as: "collection2"
        }
    }, {'$unwind':'$collection2'},
  {
        $lookup: {
            from: "collection3",
            let: {
                collection1_Id: "$_id",

            },
            pipeline: [
                {
                    $match: {
                        $expr: {
                            $eq: ["$collection1_Id", "$$$collection1_Id"]
                        }
                    }
                }
            ], as: "collection3"
        }
    },])

现在此查询给出collection1和collection2的结果,因为“ city”是公用密钥,但是collection1和collection3之间的公用密钥分别是“ _id”和“ collection1_Id”,我不能在第三个管道中使用第一个管道的the_id管道,如果我不能,那么此解决方法是什么。我正在尝试实现此问题说明。 1:,我需要找出所有活动ID的FOM集合1。 2:然后,我需要从collection2中找出该城市的所有“代码”。 3:然后,如果collection1_id与collection1“ _id”匹配,那么我需要从collection3中查找“ chainCount”。

1 个答案:

答案 0 :(得分:0)

我想您正在寻找$facet阶段:

{ $facet:
   {
      output_collection2: [ {
        $lookup: {
            from: "collection2",
       ....
       ],
      output_collection3: [ {
        $lookup: {
            from: "collection3",
        ...
      ],
   }
}