Получение различных агрегированных полей с помощью мангусты - PullRequest
0 голосов
/ 17 февраля 2020

Я пытаюсь обернуть голову вокруг запроса, который я пытаюсь сделать с mon goose на Node JS. Вот мой набор данных:

{"_id":{"$oid":"5e49c389e3c23a1da881c1c9"},"name":"New York","good_incidents":{"$numberInt":"50"},"salary":{"$numberInt":"50000"},"bad_incidents":"30"}
{"_id":{"$oid":"5e49c3bbe3c23a1da881c1ca"},"name":"Cairo","bad_incidents":{"$numberInt":"59"},"salary":{"$numberInt":"15000"}}
{"_id":{"$oid":"5e49c42de3c23a1da881c1cb"},"name":"Berlin","incidents":{"$numberInt":"30"},"bad_incidents":"15","salary":{"$numberInt":"55000"}}
{"_id":{"$oid":"5e49c58ee3c23a1da881c1cc"},"name":"New York","good_incidents":{"$numberInt":"15"},"salary":{"$numberInt":"56500"}}

Что я пытаюсь сделать, это получить эти значения:

  1. Самый повторяющийся город в коллекции
  2. Среднее значение bad_incidents
  3. Максимальное значение good_incidents
  4. Максимальная зарплата, когда нет плохих инцидентов

Я пытаюсь обернуть голову, как я могу сделать это в одном запросе, потому что мне нужно только одно значение на поле. Я был бы рад, если бы кто-нибудь привел меня на правильный путь. Нет необходимости в полном решении

С уважением!

1 Ответ

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

Вы можете выполнить агрегирование MongoDB с помощью оператора $ facet , который позволяет вычислять несколько агрегаций одновременно.

db.collection.aggregate([
  {
    $facet: {
      repeated_city: [
        {
          $group: {
            _id: "$name",
            name: {
              $first: "$name"
            },
            count: {
              $sum: 1
            }
          }
        },
        {
          $match: {
            count: {
              $gt: 1
            }
          }
        },
        {
          $sort: {
            count: -1
          }
        },
        {
          $limit: 1
        }
      ],
      bad_incidents: [
        {
          $group: {
            _id: null,
            avg_bad_incidents: {
              $avg: {
                $toInt: "$bad_incidents"
              }
            }
          }
        }
      ],
      good_incidents: [
        {
          $group: {
            _id: null,
            max_good_incidents: {
              $max: {
                $toInt: "$good_incidents"
              }
            }
          }
        }
      ],
      max_salary: [
        {
          $match: {
            bad_incidents: {
              $exists: false
            }
          }
        },
        {
          $group: {
            _id: null,
            max_salary: {
              $max: {
                $toInt: "$salary"
              }
            }
          }
        }
      ]
    }
  },
  {
    $replaceWith: {
      $mergeObjects: [
        {
          $arrayElemAt: [
            "$repeated_city",
            0
          ]
        },
        {
          $arrayElemAt: [
            "$bad_incidents",
            0
          ]
        },
        {
          $arrayElemAt: [
            "$good_incidents",
            0
          ]
        },
        {
          $arrayElemAt: [
            "$max_salary",
            0
          ]
        }
      ]
    }
  }
])

MongoPlayground


[
  {
    "_id": null,
    "avg_bad_incidents": 34.666666666666664,
    "count": 2,
    "max_good_incidents": 50,
    "max_salary": 56500,
    "name": "New York"
  }
]
...