2016-12-05 2 views
2

Je suis nouveau sur mongodb et je veux obtenir le nom du champ (type de pièce de rechange) qui a le nombre maximum! Un exemple de document dans ma collection (collection originale a 50 documents) est donnée ci-dessousObtenir le nom du champ avec le nombre maximum de mongodb

[ 
    { 
    "Vehicle": { 
     "licensePlateNo": "111A", 
     "vehicletype": "Car", 
     "model": "Nissan Sunny", 
     "VehicleCategory": [ 
     { 
      "name": "Passenger" 
     } 
     ], 
     "SparePart": [ 
     { 
      "sparePartID": 4, 
      "Type": "Wheel", 
      "Price": 10000, 
      "Supplier": [ 
      { 
       "supplierNo": 10, 
       "name": "Saman", 
       "contactNo": 112412634 
      } 
      ] 
     } 
     ], 
     "Employee": [ 
     { 
      "employeeNo": 3, 
      "job": "Painter", 
      "jobCategory": "", 
      "salary": 100000 
     } 
     ] 
    } 
    } 
] 

Comment puis-je écrire une requête pour obtenir le nom de la pièce de rechange avec le nombre le plus élevé?

+0

Où est le comte? –

+0

il n'y a pas de compte que je veux exécuter une requête comme sélectionnez le type de pièce de rechange du véhicule où max (compte) –

+0

Toujours aucune idée de ce que vous demandez. –

Répondre

1

Utilisez l'infrastructure d'agrégation pour ce type de requête. En particulier, vous aurez besoin d'exécuter une opération d'agrégation où le pipeline se compose des étapes suivantes (dans l'ordre):

$unwind - Vous avez besoin de ce que la première étape de pipeline afin d'aplatir le tableau SparePart de sorte que vous peut traiter les documents comme dénormalisés plus loin dans le pipeline. Sans cela, vous n'obtiendrez pas le résultat souhaité car les données seront au format tableau et les opérateurs d'accumulateurs au sein de l'étape précédente travailleront sur des documents uniques pour agréger les comptes.

$group - Cette étape calcule les comptes pour vous, pour les documents regroupés par le champ Type. L'opérateur accumulateur $sum renverra le nombre total de documents avec chaque groupe.

$sort - Comme vous obtenez les résultats de la canalisation précédente $group, vous devez commander les documents par le champ de comptage afin que vous obtenez le document le plus haut avec comptes.

$limit - Cela vous donnera le document principal.

Maintenant, l'assemblage ci-dessus ensemble, vous devez exécuter le pipeline suivant pour obtenir le résultat souhaité:

db.AutoSmart.aggregate([ 
    { "$unwind": "$Vehicle.SparePart" }, 
    { 
     "$group": { 
      "_id": "$Vehicle.SparePart.Type", 
      "count": { "$sum": 1 } 
     } 
    }, 
    { "$sort": { "count": -1 } }, 
    { "$limit": 1 } 
]) 
+0

Thanx son travail! –

+0

Si je veux obtenir le minimum, comment puis-je le changer? –

+0

Pour obtenir le minimum, changez le pipeline '$ sort' en' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' "". – chridam