Abrufen, nur die abgefragte element in einem array-Objekt in der MongoDB collection
Angenommen, Sie haben die folgenden Dokumente in meiner Sammlung:
{
"_id":ObjectId("562e7c594c12942f08fe4192"),
"shapes":[
{
"shape":"square",
"color":"blue"
},
{
"shape":"circle",
"color":"red"
}
]
},
{
"_id":ObjectId("562e7c594c12942f08fe4193"),
"shapes":[
{
"shape":"square",
"color":"black"
},
{
"shape":"circle",
"color":"green"
}
]
}
Abfrage:
db.test.find({"shapes.color": "red"}, {"shapes.color": 1})
Oder
db.test.find({shapes: {"$elemMatch": {color: "red"}}}, {"shapes.color": 1})
Gibt abgestimmte Dokument (Dokument 1), aber immer mit ALLEN array-Elementen in shapes
:
{ "shapes":
[
{"shape": "square", "color": "blue"},
{"shape": "circle", "color": "red"}
]
}
Jedoch, würde ich mag, um das Dokument (Dokument 1) nur mit der array enthält color=red
:
{ "shapes":
[
{"shape": "circle", "color": "red"}
]
}
Wie kann ich dies tun?
InformationsquelleAutor Sebtm | 2010-10-21
Du musst angemeldet sein, um einen Kommentar abzugeben.
MongoDB 2.2 neue
$elemMatch
Projektions-operator bietet eine weitere Möglichkeit zum ändern der zurückgegebene Dokument enthalten nur die ersten abgestimmtshapes
element:Gibt:
In 2.2 können Sie auch dies tun, indem Sie die
$ Projektions-operator
, wo die$
in einer Projektion-Objekt-Feld name steht für den index des Feldes, das erste matching-array element aus der Abfrage. Im folgenden liefert die gleichen Ergebnisse wie oben:MongoDB 3.2 Update
Beginnend mit der Version 3.2 verwenden, können Sie die neue
$filter
aggregation operator zum filtern von einem array während der Projektion, das hat den Vorteil, einschließlich alle entspricht, statt nur die erste.Ergebnisse:
$elemMatch
und$
nur das erste match.jede Lösung, ob ich zurückgeben soll alle Elemente, die es entspricht, statt nur das erste?
yup, ich habe es schließlich auch, danke!
Siehe die option mit
$filter
man alle Spiele.Dies funktioniert auch:
db.test.find({}, {shapes: {$elemMatch: {color: "red"}}});
InformationsquelleAutor JohnnyHK
Den neuen Aggregation Framework in MongoDB 2.2+ bietet eine alternative zu Map/reduce. Die
$entspannen
operator kann verwendet werden, zu trennenshapes
array in einen stream, der Unterlagen, die abgestimmt werden können:Ergebnisse in:
$elemMatch
ist eine weitere option. Ich habe tatsächlich hier durch ein Google-Gruppe Frage wo $elemMatch würde nicht funktionieren, denn es gibt nur den ersten match pro Dokument.Danke, ich war nicht bewusst, dass die Beschränkung so, dass ist gut zu wissen. Sorry für das löschen meiner Kommentare, die Sie sind, reagieren, beschloss ich, nach einer anderen Antwort statt und nicht wollen, um Leute zu verwirren.
Keine Sorge, es gibt jetzt drei nützliche Antworten für die Frage 😉
Für die anderen Suchenden, zusätzlich dazu habe ich auch versucht, indem
{ $project : { shapes : 1 } }
- das schien zu funktionieren und hilfreich wäre, wenn die umgebenden Dokumente wurden groß und Sie wollte nur zum anzeigen dershapes
wichtige Werte.Ich aktualisiert die Beispiel eine anfängliche $match Bühne. Wenn Sie interessiert sind, in einer mehr effizienten feature-Vorschlag, den ich sehen würde/upvote SERVER-6612: Unterstützung der Projektierung mehrere array-Werte in einer Projektion wie die $elemMatch Projektion-Bezeichner in der MongoDB-issue tracker.
InformationsquelleAutor Stennie
Bereich selector-parameter beschränkt sich auf vollständig-Eigenschaften. Es kann nicht verwendet werden, auswählen, die Sie ein array, nur das gesamte array. Ich habe versucht mit der $ positions-Betreiber, aber das hat nicht funktioniert.
Der einfachste Weg ist es, einfach filter die Formen in der client -.
Wenn Sie wirklich müssen die korrekte Ausgabe direkt von MongoDB, können Sie verwenden Sie einen map-reduce filtern zu Formen.
InformationsquelleAutor Niels van der Rest
Einem anderen interessantem Weg ist, um "$schwärzen, die eine der neue aggregation-Funktionen von MongoDB 2.6. Wenn Sie mit 2.6, brauchen Sie nicht ein $zu entspannen, verursachen Sie performance-Probleme, wenn Sie große arrays.
$redact
"beschränkt den Inhalt der Dokumente auf der Basis von gespeicherten Informationen in den Dokumenten selbst". So wird es laufen, nur innerhalb des Dokuments. Es ist im Grunde scannt das Dokument von oben nach unten, und prüft, ob es übereinstimmungen mit Ihrenif
Bedingung, die in$cond
, wenn es übereinstimmt, wird es entweder die Inhalte($$DESCEND
) oder entfernen($$PRUNE
).Im Beispiel oben das erste
$match
gibt das ganzeshapes
array und $schwärzen Streifen nach unten auf das erwartete Ergebnis.Beachten Sie, dass
{$not:"$color"}
ist notwendig, da es scannt das top-Dokument als auch, und wenn$redact
keinecolor
Feld auf der obersten Ebene zurückkehrenfalse
könnten Streifen Sie das ganze Dokument, die wir nicht wollen.Ich habe Zweifel. Im Beispiel "shapes" ist ein array. Wird "$schwärzen" scan alle Objekte in der "shapes" - array ?? Wie das wird mit Bezug auf die Leistung??
nicht alle, aber das Ergebnis von Ihrem ersten Spiel. Das ist der Grund, warum Sie
$match
als Ihre erste Aggregat der Bühneokkk.. wenn ein index erstellt, der auf "Farbe" - Feld, auch dann wird es Scannen Sie alle Objekte in der "shapes" - array??? Was könnte die effiziente Möglichkeit der übereinstimmenden mehrere Objekte in einem array???
Genial! Ich verstehe nicht, wie man $eq arbeitet hier. Ich habe es Links aus Zitat und das hat nicht funktioniert für mich. Irgendwie sieht es in der Anordnung von Formen zu finden, die übereinstimmen, aber die Abfrage nie gibt an, welches array zu sehen. Wie, wenn die Dokumente waren Formen und zum Beispiel Größen; $eq Blick in die beiden arrays für die Spiele? $Schwärzen nur auf der Suche nach etwas in dem Dokument, das entspricht dem 'wenn' - Bedingung?
InformationsquelleAutor anvarik
Besser können Sie die Abfrage in der passenden array-element mit
$slice
ist es hilfreich, auf die Rückkehr der signifikanten Objekt in einem array.$slice
ist hilfreich, wenn Sie wissen, der index des Elements, aber manchmal möchte manwelches array-element passen zu Ihrer Kriterien. Zurück können Sie den passenden element
mit der
$
Betreiber.InformationsquelleAutor Narendran
AUSGÄNGE
InformationsquelleAutor Viral Patel
Den syntax finden Sie in mongodb ist
und die zweite Abfrage, die Sie geschrieben haben, dass ist
in diesem Sie verwendet haben, die
$elemMatch
operator in query-Teil, in der Erwägung, dass, wenn Sie verwenden Sie diesen operator in der Projektion Teil, dann erhalten Sie das gewünschte Ergebnis. Sie können schreiben Sie Ihre Abfrage alsDadurch erhalten Sie das gewünschte Ergebnis.
"shapes.color":"red"
im Abfrage-parameter (Erster parameter der find-Methode) ist nicht notwendig. Sie können ersetzen es mit{}
und erhalten die gleichen Ergebnisse.Dein Vorschlag ist richtig, in dem obigen Fall, wo wir brauchen, um zu finden das Dokument, die mit der Farbe rot und die Projektion auf Sie nur. Aber sagen wir mal so, wenn jemand benötigt, um herauszufinden, alle Dokument, die Farbe blau, aber sollte es wieder nur die element, die Formen array, Farbe rot. In diesem Fall ist die obige Abfrage auf die verwiesen werden kann, indem jemand anderes auch..
Dies scheint die einfachste, aber ich kann nicht damit es funktioniert. Es gibt nur die erste passende Filialdokument.
InformationsquelleAutor Vicky
Dank JohnnyHK.
Hier möchte ich nur hinzufügen, dass einige komplexere Verwendung.
InformationsquelleAutor Eddy
Brauchen Sie nur auf Abfrage ausführen
Ausgabe dieser Abfrage ist
als Sie es erwartet haben werden gibt das genaue Feld aus dem array entspricht, color:'red'.
InformationsquelleAutor Vaibhav Patil
zusammen mit $Projekt wird es sinnvoller sein, andere weisen, die passenden Elemente werden zusammengefasst mit anderen Elementen im Dokument.
InformationsquelleAutor shakthydoss
InformationsquelleAutor Poonam Agrawal