J'essaie de comprendre la requête que j'essaie de faire avec mongoose sur Node JS. Voici mon jeu de données :

{"_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"}}

Ce que j'essaie de faire, c'est d'obtenir ces valeurs:

  1. La ville la plus répétée de la collection
  2. La moyenne des mauvais_incidents
  3. La valeur maximale de good_incidents
  4. Salaire maximum là où il n'y a pas de mauvais_incidents

J'essaie de comprendre comment je peux le faire en une seule requête, car je n'ai besoin que d'une valeur par champ. Je serais heureux que quelqu'un me conduise sur la bonne voie. Pas besoin de solution complète

Cordialement!

0
r.Die 17 févr. 2020 à 01:48

1 réponse

Meilleure réponse

Vous pouvez effectuer une agrégation MongoDB avec $facet qui permet de calculer plusieurs agrégations à la fois.

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"
  }
]
0
Valijon 16 févr. 2020 à 23:44