$lookup) ObjectId ' s in ein array
Was ist die syntax für eine $lookup auf ein Feld, das ein array von ObjectIds, anstatt nur einer einzigen ObjectId?
Beispiel Um Dokument:
{
_id: ObjectId("..."),
products: [
ObjectId("..<Car ObjectId>.."),
ObjectId("..<Bike ObjectId>..")
]
}
Nicht Funktioniert-Abfrage:
db.orders.aggregate([
{
$lookup:
{
from: "products",
localField: "products",
foreignField: "_id",
as: "productObjects"
}
}
])
Gewünschte Ergebnis
{
_id: ObjectId("..."),
products: [
ObjectId("..<Car ObjectId>.."),
ObjectId("..<Bike ObjectId>..")
],
productObjects: [
{<Car Object>},
{<Bike Object>}
],
}
Ist mein Beispiel mit Bestellung Dokuments nicht klar genug? möchten Sie Beispiel-Dokumente für die Produkte aus?
SERVER-22881 verfolgen array funktioniert wie erwartet (nicht wie eine wörtliche Wert).
SERVER-22881 verfolgen array funktioniert wie erwartet (nicht wie eine wörtliche Wert).
InformationsquelleAutor Jason Lin | 2016-01-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
$lookup
aggregation pipeline-Stufe wird nicht direkt mit einem array. Die wichtigste Absicht der Entwurf für ein "left join" als "eins zu vielen" Art der Verknüpfung ( oder wirklich ein "lookup" ) über die möglichen Daten. Aber der Wert bestimmt ist singular und nicht ein array.Daher müssen Sie "de-normalisieren" der Inhalt zunächst vor der Durchführung der
$lookup
Betrieb, um für diese zu arbeiten. Und das bedeutet, dass mit$entspannen
:Nach
$lookup
entspricht jedes array-Mitglied das Ergebnis ist selbst ein array, so dass Sie$unwind
wieder und$group
zu$push
neue Felder für das endgültige Ergebnis.Beachten Sie, dass alle "left join" matches, die nicht gefunden wird, erstellen Sie ein leeres array für die "productObjects" auf das angegebene Produkt und damit negieren Sie das Dokument, für das "Produkt" element, wenn die zweite
$unwind
genannt wird.Obwohl eine direkte Anwendung auf ein array wäre schön, es ist nur, wie diese derzeit funktioniert durch übereinstimmende singuläre Wert auf eine möglichst viele.
Als
$lookup
ist im Grunde sehr neu ist, arbeitet derzeit als vertraut sein würde, um diejenigen, die vertraut sind mit Mungo als "poor mans version" der.populate()
Methode, die dort angeboten werden. Mit dem Unterschied, dass$lookup
bietet "server-Seite" Verarbeitung "join" im Gegensatz zu der auf dem client, und einige der "Reife" in$lookup
derzeit fehlt von dem, was.populate()
bietet ( wie die Interpolation der lookup direkt auf ein array ).Dies ist eigentlich eine zweckgebundene Ausgabe für Verbesserungen SERVER-22881, also mit etwas Glück würde dieser Treffer dem nächsten release oder bald nach.
Als design-Prinzip, die Ihrer aktuellen Struktur ist weder gut noch schlecht, sondern einfach nur vorbehaltlich der Overhead beim erstellen von "join". Als solche, der grundlegenden Grundsatzes von MongoDB in Gründung gilt, bei denen, wenn man "kann" damit Leben die Daten "vor-sich" in die Sammlung gehört, dann ist es am besten, dies zu tun.
Das eine andere Sache, die gesagt werden kann, der
$lookup
als ein Allgemeines Prinzip ist, dass die Absicht, die "beitreten" - hier ist es Umgekehrt als hier dargestellt. Also anstatt zu halten Sie die "zugehörigen ids" von den anderen Unterlagen innerhalb der "Eltern" - Dokument, das Allgemeine Prinzip, wie es am besten ist, wo die "Verwandte Dokumente" enthalten einen Verweis auf die "Eltern".So
$lookup
kann gesagt werden, "am besten funktionieren" mit einer "relation design" , ist das Gegenteil davon, wie so etwas wie Mungo.populate()
führt es client-side-joins. Durch idendifying die "man" in jedem "viele" statt, dann ziehst du einfach in den Verwandte Artikel ohne$unwind
das array Erster.Nicht als straigtforward als "gut/schlecht", so gibt es ein bisschen mehr Erklärung Hinzugefügt, um die Antwort. Es hängt davon ab, was zu Ihnen passt.
die aktuelle Umsetzung ist etwas unbeabsichtigtes. macht es Sinn zu schauen, bis alle Werte in einem array der lokalen-Feld, ist es nicht sinnvoll, mit dem array-wortwörtlich-SERVER-22881 verfolgen Befestigung.
Das macht Sinn. Ich habe im Allgemeinen die Behandlung von Anfragen re
$lookup
- und Dokument-Validierung als Funktionen in Ihren Kinderschuhen und wird sich voraussichtlich noch verbessern. Also direkte expansion auf ein array würde begrüßt werden, als würde eine "Abfrage", die die Ergebnisse filtern. Diese beiden würden sich viel mehr an den Mungo.populate()
Prozess, den viele gewohnt sind. Hinzufügen der Ausgabe link direkt in die Antwort-Inhalte.Dank einer Tonne mate. Obwohl, ich fühle immer noch tun, verbindet ist ziemlich schwer, wenn es in kommt zu MongoDB im Vergleich zu relationalen DB-Lösungen. Aber, noch einmal MongoDB ist nicht dazu gedacht, für solche Operationen.
InformationsquelleAutor Blakes Seven
Den
$lookup
aggregation pipeline-Stufe arbeitet JETZT direkt mit einem array (an3.3.4 version).
Finden Sie unter: suchen zwischen lokalen (mehrere)Arrays von Werten und Ausland (Einzel -) Wert
Nein, sieht nicht, wie seine Arbeit! dennoch bin ich mit demselben Problem
gibt es ein Beispiel dafür?
Ich bin kämpfen, um zu verstehen, wie dieser Zeiger einige mongodb problem-tracker stellt eine Antwort, noch, wie kommen 39 Menschen, die von Ihnen positiv bewertet werden als nützlich !! Ich habe den link gefolgt und Las, was dort ist 3 mal jetzt, und ich weiß immer noch nicht, was ich Lesen ...
InformationsquelleAutor joseaio
verwenden $entspannen erhalten Sie das erste Objekt statt array von Objekten
- Abfrage:
Ergebnis:
InformationsquelleAutor KARTHIKEYAN.A
Können Sie auch die
pipeline
Bühne Prüfungen an einem sub-docunment arrayHier ist das Beispiel mit den
python
(sorry, ich bin Schlange Menschen).Den Haken an der Sache ist es, dass alle Objekte in der
ObjectId
array
(ausländische_id
ist inlocal
Feld/Stützeproducts
).Können Sie auch bereinigen oder das Projekt der ausländischen Datensätze mit zusätzlichen
stage
s, angegeben durch die obige Bemerkung.InformationsquelleAutor user12164
Aggregation mit
$lookup
und die anschließende$group
ist ziemlich umständlich, so dass, wenn (und das ist ein medium, wenn), Sie sind mit Knoten & Mungo oder eine unterstützende Bibliothek mit einigen hinweisen in dem schema, man könnte ein.Auffüllen()
zu Holen, diese Dokumente:InformationsquelleAutor Archimedix