mongodb aggregation framework-Gruppe + Projekt
Ich habe Folgendes Problem:
diese Abfrage zurück 1 Ergebnis, das ist, was ich will:
> db.items.aggregate([ {$group: { "_id": "$id", version: { $max: "$version" } } }])
{
"result" : [
{
"_id" : "b91e51e9-6317-4030-a9a6-e7f71d0f2161",
"version" : 1.2000000000000002
}
],
"ok" : 1
}
diese Abfrage ( habe ich nur noch Projektion, so kann ich später eine Abfrage für das gesamte Dokument) die mehrere Ergebnisse zurückgeben. Was mache ich falsch?
> db.items.aggregate([ {$group: { "_id": "$id", version: { $max: "$version" } }, $project: { _id : 1 } }])
{
"result" : [
{
"_id" : ObjectId("5139310a3899d457ee000003")
},
{
"_id" : ObjectId("513931053899d457ee000002")
},
{
"_id" : ObjectId("513930fd3899d457ee000001")
}
],
"ok" : 1
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
fand die Antwort
1. ersten ich brauche, um all die _ids
2. dann brauche ich für die Abfrage der Dokumente
welche wie folgt aussieht:
( Ich weiß, das ist spät, aber noch zu beantworten, so dass andere Leute nicht haben, zu gehen, Suche nach der richtigen Antwort, die anderswo )
Sehen den Antwort von Deka, dies zu tun Ihren job.
Nicht alle Akkus sind verfügbar in
$project
Bühne. Wir müssen überlegen, was wir tun können, im Projekt mit Bezug zu Akkumulatoren und was können wir tun in der Gruppe. Lassen Sie uns nehmen einen Blick auf diese:Wo wir prüfen, wenn eine der
funding_rounds
ist nicht leer. Dann ist esunwind
-ed$sort
und zu den späteren Phasen. Wir werden sehen, ein Dokument für jedes element derfunding_rounds
array für jedes Unternehmen. Also, das erste, was wir hier tun, ist$sort
basierend auf:funding_rounds.funded_year
funding_rounds.funded_month
funding_rounds.funded_day
In der Gruppenphase, die von name des Unternehmens, das array wird immer gebaut mit
$push
.$push
ist eigentlich ein Teil eines Dokuments als der angegebene Wert für ein Feld, das wir den Namen in einer Gruppenphase. Wir schieben Sie auf jeder gültige Ausdruck sein. In diesem Fall sind wir drängen auf Dokumente, die auf dieses array und für jedes Dokument, das schieben wir es Hinzugefügt, um das Ende des Arrays, die wir ansammeln. In diesem Fall sind wir drängen auf Dokumente, die von der gebautraised_amount
undfunded_year
. So, die$group
Bühne ist ein Strom von Dokumenten, haben eine_id
wo wir die Angabe der Namen des Unternehmens.Beachten Sie, dass
$push
ist in$group
Stadien, aber nicht in$project
Bühne. Dies ist, weil$group
Stufen sind entwickelt, um eine Sequenz von Dokumenten und sammeln Werte, basierend auf dem stream von Dokumenten.$project
auf der anderen Seite, arbeitet mit einem Dokument zu einem Zeitpunkt. Also, wir können berechnen, durchschnittlich auf ein array innerhalb eines einzelnen Dokuments innerhalb einer Projektphase. Aber etwas wie das zu tun, wo man gleichzeitig sehen wir Dokumente und für jedes Dokument, übergibt es durch die Gruppenphase schaffen, drängen auf einen neuen Wert, gut, dass ist etwas, dass die$project
Bühne ist nicht nur entworfen, um zu tun. Für diese Art der operation wollen wir mit$group
.Lassen Sie uns einen Blick auf ein anderes Beispiel:
In der
$group
Bühne, wir sind mit$first
und$last
Akkumulatoren. Rechts, wieder können wir sehen, dass, wie mit$push
- wir können nicht$first
und$last
im Projekt-Phasen. Da wieder -, Projekt-Phasen sind nicht entworfen, um zu sammeln Werte, die sich aus mehreren Dokumenten. Vielmehr sind Sie entwickelt, um Form Dokumente ein zu einer Zeit. Gesamt-Runden-Zahl wird berechnet, indem die$sum
Betreiber. Der Wert 1 einfach zählt die Anzahl der Dokumente Durchlaufen, die Gruppe zusammen mit jedem Dokument entspricht oder gruppiert unter einem bestimmten_id
Wert. Das Projekt kann kompliziert erscheinen, aber es ist nur die Ausgabe ziemlich. Es ist nur so, dass es einschließlichnum_rounds
undtotal_raised
aus dem vorherigen Dokument.