2016-05-01 5 views
3

gemeinsam haben Ich versuche, alle Dokumente zu finden, die teilen die max (num_sold). Ich kann nicht nur absteigend sortieren und ein Limit (1) machen, weil ich den Fall vermisse, in dem andere Dokumente auch das gleiche Maximum haben (num_sold). Angesichts diese über vereinfachte Datenmenge:Finden Sie alle Dokumente, die Max (Wert) im aggregierten Schritt

{"item":"Apple", "num_sold": 49} 
{"item":"Orange", "num_sold": 55} 
{"item":"Peach", "num_sold": 55} 
{"item":"Grape", "num_sold": 20} 
{"item":"Banana", "num_sold": 20} 

I

{"item":"Orange", "num_sold": 55} 
{"item":"Peach", "num_sold": 55}  

Verwendung von SQL zurück erhalten mag, ist dies eine einfache Abfrage und dann zurück zum Haupt Dataset verbinden. Ich bin ein bisschen ratlos, wie man das in MongoDB macht.

Ich habe das Maximum gefunden, aber wie bekomme ich alle Dokumente, die das Maximum haben?

db.t.aggregate(
    {$group:{ 
      _id:null, 
      num_sold:{$max:"$num_sold"} 
      } 
    } 
); 
{ "_id" : null, "num_sold" : 55 } 

Antwort

2

Sie können dies tun, indem Sie auf num_sold Gruppierung und dann $sort und $limit Pipeline-Stufen mit nur die Dokumentation mit dem maximalen Wert zu erhalten:

db.t.aggregate([ 
    // Group by num_sold, assembling an array of docs with each distinct value. 
    {$group: { 
     _id: '$num_sold', 
     docs: {$push: '$$ROOT'} 
    }}, 
    // Sort the groups by _id descending to put the max num_sold group first. 
    {$sort: {_id: -1}}, 
    // Return just the first (max num_sold) group of docs. 
    {$limit: 1} 
]) 

Ausgang:

{ 
    "_id" : 55.0, 
    "docs" : [ 
     { 
      "_id" : ObjectId("5726a62879ce3350ff8d607e"), 
      "item" : "Orange", 
      "num_sold" : 55.0 
     }, 
     { 
      "_id" : ObjectId("5726a62879ce3350ff8d607f"), 
      "item" : "Peach", 
      "num_sold" : 55.0 
     } 
    ] 
} 
+0

Funktioniert gut für meine Anwendung, danke! – NumericOverflow

Verwandte Themen