2016-10-23 5 views
0
db.grades.aggregate({'$group':{'_id':'$student_id', 'score':{'$gte':65}}}, {'$sort':{'score':1}}, {'$limit':1}) 

Ich kann nicht herausfinden, warum das nicht funktioniert. Es sollte "Alle Prüfungsergebnisse größer als oder gleich 65 finden und diese Werte von niedrig bis hoch sortieren."MongoDb Abfrage Aggregat

Es gibt einen Fehler aus:

Error: command failed: { "ok" : 0, "errmsg" : "unknown group operator '$gte'", "code" : 15952 } : aggregate failed

Antwort

2

Ich denke db.grades.find, sort, limit ist extrem einfach. Ich mag das. Wenn es notwendig ist, eine Aggregationspipeline zu verwenden, um fortgeschrittenere Arbeit zu leisten, dann denken Sie einfach an Aggregation als eine Reihe von Schritten. Es ist nicht wie SQL (wo Sie alles in eine einzige Anweisung stopfen).

Verwenden Sie stattdessen die Aggregationspipeline, um Ihre Abfrage in Schichten aufzubauen. Führen Sie die folgenden durch Hinzufügen von jeweils einem Element und Sie werden sehen, was ich meine.

db.grades.aggregate(
    {'$match':{'score':{'$gte':65}}}, 
    {'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}}, 
    {'$sort':{'scoreMax':-1}}, 
    {'$limit':1} 
) 

$ Spiel zieht Partituren> = 65 Führen Sie Ihre Pipeline nur mit diesem Element, und Sie werden alle passenden Noten sehen.

db.grades.aggregate(
    {'$match':{'score':{'$gte':65}}} 
) 

$ group max Punktzahl pro STUDENT_ID bekommt (also nehme ich an, ist das, was Ihr Professor will mit dem Sie arbeiten)

db.grades.aggregate(
    {'$match':{'score':{'$gte':65}}}, 
    {'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}} 
) 

$ sort legt, dass aggregierte Schüler Liste in bestellen

db.grades.aggregate(
    {'$match':{'score':{'$gte':65}}}, 
    {'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}}, 
    {'$sort':{'scoreMax':-1}} 
) 

$ limit (klügstenes dümmsten) zieht nur den besten Schüler und ihre Punktzahl.

db.grades.aggregate(
    {'$match':{'score':{'$gte':65}}}, 
    {'$group':{'_id':'$student_id', 'scoreMax':{'$max':'$score'}}}, 
    {'$sort':{'scoreMax':-1}}, 
    {'$limit':1} 
) 
+0

Gut erklärt! Danke euch allen! :) – Imdad

2

Sie nicht $gte insde Gruppe verwenden können. Sie können eine $match Aggregations-Pipelinestufe vor $group Bühne und Filter von $gte dort verwenden. Wie auch immer, ich glaube nicht, dass Sie eine Aggregation für Ihre Anfrage benötigen; Hat lösen das Problem hierbei:

db.grades.find({'score':{'$gte':65}}).sort({'score':1}).limit(1) 

?

+0

Danke für die Antwort! Ihr Weg funktioniert, aber ich brauchte es, um Aggregation zu verwenden. :) – Imdad