Совокупный конвейер с участием $ in - PullRequest
0 голосов
/ 27 января 2020

У нас есть коллекция магазинов:

    {
        "_id" : ObjectId("xxxxxx"),
        "shop" : "Q4",
        "batch" : "5647",
    }
    {
        "_id" : ObjectId("xxxxxx"),
        "shop" : "Q4",
        "batch" : "2314",
    }

Первый шаг агрегирования, как показано ниже:

Aggregates.group("$shop", Accumulators.addToSet("batch", "$batch"))

Выход:

{ "_id" : "Q4", "batch" : ["5647", "2314"]}

Теперь - учитывая другую коллекцию inventory, как показано ниже, нам нужно найти их в "batch" выше, используя $in - и добавить в вывод

 {
        "_id" : ObjectId("xxxxxx"),
        "bolt" : "5647",
    }
    {
        "_id" : ObjectId("xxxxxx"),
        "bolt" : "0001",
    }
  {
        "_id" : ObjectId("xxxxxx"),
        "bolt" : "0004",
    }

Ожидаемый результат:

{ "_id" : "Q4", "batch" : ["5647", "2314"],"bolt":["5647"]}

Как нам этого добиться?

1 Ответ

0 голосов
/ 28 января 2020

Вам нужно использовать условно $lookup. С $reduce мы конвертируем bolt:[{...}, {...}] в bolt:["...", "..."]

db.shop.aggregate([
  {
    $group: {
      _id: "$shop",
      batch: {
        $push: "$batch"
      }
    }
  },
  {
    $lookup: {
      from: "inventory",
      let: {
        batch: "$batch"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$bolt",
                "$$batch"
              ]
            }
          }
        }
      ],
      as: "bolt"
    }
  },
  {
    $project: {
      _id: 1,
      batch: 1,
      bolt: {
        $reduce: {
          input: "$bolt",
          initialValue: [],
          in: {
            $concatArrays: [
              "$$value",
              [
                "$$this.bolt"
              ]
            ]
          }
        }
      }
    }
  }
])

MongoPlayground

...