Этап условной агрегации - PullRequest
       44

Этап условной агрегации

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

У нас есть 3 коллекции для отслеживания автомастерской.
PARTS дает общее количество предметов против shopID
Нам нужно подтвердить, равна ли сумма предметов в INPROCESS и REJECT количеству. в PARTS для магазина.

Тем не менее, мы go рассмотрим REJECT - ТОЛЬКО если INPROCESS не равно количеству, тем самым экономя поиск.

Как этого добиться.

PARTS

{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q4",
    "count": 200,
}


INPROCESS

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


REJECTED

{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q4",
    "itemID": "xxxx",
},
{
    "_id": ObjectId("xxxxxx"),
    "shop": "Q4",
    "itemID": "yyyy",
},

1 Ответ

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

Попробуйте это:

db.PARTS.aggregate([
  {
    $lookup: {
      from: "INPROCESS",
      localField: "shop",
      foreignField: "shop",
      as: "inprocess"
    }
  },
  {
    $match: {
      $expr: {
        $ne: [
          "$count",
          {
            $size: "$inprocess"
          }
        ]
      }
    }
  },
  {
    $lookup: {
      from: "REJECTED",
      localField: "shop",
      foreignField: "shop",
      as: "rejected"
    }
  },
  {
    $match: {
      $expr: {
        $ne: [
          "$count",
          {
            $add: [
              {
                $size: "$inprocess"
              },
              {
                $size: "$rejected"
              }
            ]
          }
        ]
      }
    }
  }
])

MongoPlayground

...