$ match в совокупности не возвращает данные в mongodb - PullRequest
1 голос
/ 16 апреля 2020

У меня есть три таблицы ниже, это структура, как показано ниже Structure of the tables

Я хочу получить результат, как показано ниже

"type1": [ -- type from Accounts collection
            {
                "_id": "5e97e9a224f62f93d5x3zz46", -- _id from Accounts collection
                "locs": "sampleLocks 1", -- field from Accounts collection
                "solutions": "sample solutions 1", -- field from Accounts collection
                "Clause": "clause 1" -- field from AccountsDesc collection
            },
            {
                "_id": "5e97e9a884f62f93d5x3zz46", 
                "locs": "sampleLocks2",
                "solutions": "sample solutions2", 
                "Clause": "clause2" 
            }
        ],

        "type2": [
         // same data construction as of type1 above
        ]
  1. _id, блокировки, решение, которое будет получено из Коллекция учетных записей
  2. Поле предложения, которое будет получено из AccountsDes c collection
  3. accounts_id, является своего рода внешний ключ в AccountsDes c, исходящий из Account
  4. Competitor_id, является своего рода внешним ключом в AccountsDes c, исходящим от Competitor

Ниже приведен мой запрос как

db.accountDesc.aggregate([
  { 
        $match : {accounts_Id : "123456"}, active: true}
  },
  {
    $lookup: {
        from: 'accounts',
        pipeline: [{ $match: { type: { $in: ["type1, type2, type3"] } } }],
        as: 'accountsData'
    }
  },
  {
    $group: {

      _id: "$accountsData.type",
      data: {
           $push:  {_id: "$accountsData._id", clause: "$clause", locs: "$type.locs",  solutions: "$type.solutions"}
       }
    }
  },
   {
    $group: {
        _id: null,
            data: {
                $push: {
                    k: {
                        $toString: '$_id'
                    },
                    v: '$data'
                }
            }
        }
    },
    {
        $replaceRoot: {
            newRoot: {
                $arrayToObject: '$data'
            }
        }
    }
])

Проблемы, связанные с запросом -

  1. $match : {accountId : "123456"}, active: true} - Данные не возвращаются, если я использую совпадение в AccountsDes c collection
  2. не могу установить localField, foriegnField, если я использую конвейер, то как будет происходить сопоставление, как при левом соединении.
  3. предложение: "$clause" не получить значение этого поля в ответе

1 Ответ

1 голос
/ 16 апреля 2020

Как мы уже обсуждали в чате, вам нужно ПРАВОЕ НАРУЖНОЕ СОЕДИНЕНИЕ для вашей агрегации.

Попробуйте запрос ниже:

db.User_Promo_Map.aggregate([
  {
    $match: {
      user_Id: ObjectId("5e8c1180d59de1704ce68112")
    }
  },
  {
    $lookup: {
      from: "promo",
      pipeline: [
        {
          $match: {
            active: true,
            platform: {
              $in: [
                "twitch",
                "youtube",
                "facebook"
              ]
            }
          }
        }
      ],
      as: "accountsData"
    }
  },
  {
    $unwind: "$accountsData"
  },
  {
    $group: {
      _id: "$accountsData.platform",
      data2: {
        $addToSet: {
          amount: "$amount",
          promo_Id: "$promo_Id"
        }
      },
      data: {
        $addToSet: {
          _id: "$accountsData._id",
          format: "$accountsData.format",
          description: "$accountsData.description"
        }
      }
    }
  },
  {
    $addFields: {
      data: {
        $map: {
          input: "$data",
          as: "data",
          in: {
            "_id": "$$data._id",
            "description": "$$data.description",
            "format": "$$data.format",
            amount: {
              $reduce: {
                input: "$data2",
                initialValue: "$$REMOVE",
                in: {
                  $cond: [
                    {
                      $eq: [
                        "$$this.promo_Id",
                        "$$data._id"
                      ]
                    },
                    "$$this.amount",
                    "$$value"
                  ]
                }
              }
            }
          }
        }
      }
    }
  },
  {
    $group: {
      _id: null,
      data: {
        $push: {
          k: {
            $toString: "$_id"
          },
          v: "$data"
        }
      }
    }
  },
  {
    $replaceRoot: {
      newRoot: {
        $arrayToObject: "$data"
      }
    }
  }
])

MongoPlayground

...