Mongodb - Найти количество отдельных элементов после применения агрегата и соответствия - PullRequest
0 голосов
/ 05 января 2020

Попытка выяснить что-то из Пн go, используя мон goose оптимальным образом.

У меня есть следующие документы

Регионы

{
    "_id" : ObjectId("5cf21263ff605c49cd6d8016"),
    "name" : "Asia"
}

Страны могут быть частью нескольких регионов

{
    "_id" : ObjectId("5d10a4ad80a93a1d7cd56cc6"),
    "regions" : [ 
        ObjectId("5d10a50080a93a1d7cd56cc7"), 
        ObjectId("5cf2126bff605c49cd6d8017")
    ],
    "name" : "India"
}

Места принадлежит одной стране

{
    "_id" : ObjectId("5d11bb8180a93a1d7cd56d26"),
    "name" : "Delhi",
    "country" : ObjectId("5d136e7a4e480863a51c4056"),
}

Программы каждый в массиве dayshows представляет один день. В день шоу может охватывать несколько мест.

{
    "_id" : ObjectId("5d11cc9480a93a1d7cd56d31"),
    "dayshows" : [ 
        { 
            "_id" : ObjectId("5d11cc9480a93a1d7cd56d41"),
            "places" : [ 
                ObjectId("5d11bb8180a93a1d7cd56d26")
            ],
        },
         {
            "_id" : ObjectId("5d11cc9480a93a1d7cd56d3c"),
            "places" : [ 
                ObjectId("5d11bb8180a93a1d7cd56d26"),
                ObjectId("5d11bc7c80a93a1d7cd56d2e")
            ]
         }
     ]
}

Что я пытаюсь выяснить?

Для данного региона, для каждой страны в регионе, где покрыты все места, и количество программ для каждого место. Используя nodejs и mon goose.

Пример

Input - Asia

Output
India
 - Delhi (3)
 - Mumbai (5)

Thailand
 - Pattaya (2)
 - Bangkok (5)

Новое в пн go.

1 Ответ

1 голос
/ 05 января 2020

Вам нужно использовать $ lookup для скрещивания разных коллекций.

Трубопровод: Этапы 1-6 служат для получения всех связанных данных. (Необязательно) Этапы 7-10 служат для преобразования агрегированных данных в key:pair объект.

Предположение

Programs, чтобы посетить 2 места, которые считаются как есть (Place1: +1, Place2: +1) Вы знаете, как выполнить агрегирование MongoDB в node.js

db.Regions.aggregate([
  {
    $match: {
      name: "Asia"
    }
  },
  {
    $lookup: {
      from: "Countries",
      let: {
        region: "$_id"
      },
      pipeline: [
        {
          $match: {
            $expr: {
              $in: [
                "$$region",
                "$regions"
              ]
            }
          }
        },
        {
          $lookup: {
            from: "Places",
            localField: "_id",
            foreignField: "country",
            as: "Places"
          }
        }
      ],
      as: "Countries"
    }
  },
  {
    $unwind: "$Countries"
  },
  {
    $unwind: "$Countries.Places"
  },
  {
    $lookup: {
      from: "Programs",
      localField: "Countries.Places._id",
      foreignField: "dayshows.places",
      as: "Countries.Places.Programs"
    }
  },
  {
    $project: {
      "name": 1,
      "Countries.name": 1,
      "Countries.Places.name": 1,
      "Countries.Places.Programs": {
        $size: "$Countries.Places.Programs"
      }
    }
  },
  {
    $group: {
      _id: {
        name: "$name",
        Countries: "$Countries.name"
      },
      Places: {
        $push: {
          k: "$Countries.Places.name",
          v: "$Countries.Places.Programs"
        }
      }
    }
  },
  {
    $project: {
      _id: 1,
      Places: {
        $arrayToObject: "$Places"
      }
    }
  },
  {
    $group: {
      _id: "$_id.name",
      Countries: {
        $push: {
          k: "$_id.Countries",
          v: "$Places"
        }
      }
    }
  },
  {
    $project: {
      _id: 0,
      name: "$_id",
      Countries: {
        $arrayToObject: "$Countries"
      }
    }
  }
])

MongoPlayground

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...