агрегация: сохранение значений из предыдущих конвейеров агрегации в mongodb - PullRequest
0 голосов
/ 29 февраля 2020

Привет, как мы можем сохранить значения из предыдущих конвейеров агрегации. Предположим, у меня есть несколько коллекций, предположим, что в этом случае 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 первого конвейера в 3-м конвейере, если я не могу, то каков обходной путь для этого. Я пытаюсь достичь этой постановки проблемы. 1: Мне нужно узнать все активные идентификаторы из коллекции1. 2: тогда мне нужно найти весь «код» для этого города из коллекции2. 3: тогда мне нужно выяснить "chainCount" из collection3, если он существует, если collection1_id совпадает с collection1 "_id".

1 Ответ

0 голосов
/ 29 февраля 2020

Полагаю, вы ищете $ facet stage:

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