Jeder. In der Mongo-Gruppenabfrage zeigt das Ergebnis nur die Schlüssel in Argumenten. So behalten Sie das erste Dokument in jeder Gruppe wie eine MySQL-Abfragegruppe. beispielsweise:
-------------------------------------------------------------------------
| name | age | sex | province | city | area | address |
-------------------------------------------------------------------------
| ddl1st | 22 | 纯爷们 | BeiJing | BeiJing | ChaoYang | QingNianLu |
| ddl1st | 24 | 纯爷们 | BeiJing | BeiJing | XuHui | ZhaoJiaBangLu |
| 24k | 220 | ... | .... | ... | ... | ... |
-------------------------------------------------------------------------
db.users.group({key: { name: 1},reduce: function ( curr, result ) { result.count ++ },initial: {count : 0 } })
Ergebnis:
[
{
"name" : "ddl1st",
"count" : 1
},
{
"name" : "24k",
"count" : 1
}
]
So erhalten Sie Folgendes:
[
{
"name" : "ddl1st",
"age" : 22,
"sex" : "纯爷们",
"province" : "BeiJing",
"city" : "BeiJing",
"area" : "ChaoYang",
"address" : "QingNianLu",
"count" : 1
},
{
"name" : "24k",
"age" : 220,
"sex" : "...",
"province" : "...",
"city" : "...",
"area" : "...",
"address" : "...",
"count" : 1
}
]
{$first: '$age'}
etc.? Ist es möglich, nur zu habenage: $age
?$group
beibehalten, die nicht in der _id enthalten sind, können Sie$sort
vorher mit dem gewünschten Feld gruppieren und verwenden$first
oder$last
Operatoren für ein beliebiges Feld. Beim Akkumulieren macht die Idee, andere Felder (die akkumuliert / geleitet / reduziert werden) einzubeziehen, auch theoretisch nicht so viel Sinn. Das Sortieren vor der Hand ist jedoch im Vergleich zum Sortieren jeder Gruppe in sich selbst ineffizient, da Sortieralgorithmen komplexer sind als O (n). Ich wünschte, es gäbe bessere Möglichkeiten in MongoDB.Übrigens, wenn Sie nicht nur das erste Dokument behalten möchten, können Sie $ addToSet verwenden . Beispiel:
quelle
Ich bin hierher gekommen, um eine Antwort zu suchen, war aber mit der ausgewählten Antwort nicht zufrieden (besonders angesichts des Alters). Ich fand diese Antwort , die eine bessere Lösung ist (angepasst):
quelle
count
Feld. Sie müssen es verwenden$mergeObjects
, um es zu behalten.Sie können dies ausprobieren
quelle
Das habe ich getan, es funktioniert gut.
quelle
Nur ein kurzes Update, wenn bei Dokumenten mit zahlreichen Feldern das gleiche Problem auftritt. Man kann die Kraft der Kombination der
$replaceRoot
Pipeline-Stufe und des$mergeObjects
Pipeline-Betreibers nutzen.quelle
Ich wusste nichts über
.group
Helfer, aber wenn Sie es vorziehen, mit dem Aggregation Framework zu arbeiten , müssen Sie angeben, welche Felder zurückgegeben werden sollen. Korrigieren Sie mich, wenn ich falsch liege, aber in SQL müssten Sie das trotzdem tun.Nun, so würden Sie es mit dem zuvor erwähnten Aggregation Framework machen:
quelle
Ich habe diese Funktion erstellt, um das Umkehren einer Abwicklungsphase zu verallgemeinern ... lass es mich wissen, wenn ihr auf irgendwelche Fehler stößt, aber es funktioniert gut für mich!
quelle
Mit
$first
dem$$ROOT
Dokument verwenden und dann$replaceRoot
mit dem ersten Feld verwenden.quelle
Wenn Sie alle Felder projizieren möchten, dokumentieren Sie diese Abfrage unten.
quelle
Hier ist die Antwort >>>>
quelle