MongoDB elemmatch mehrere Elemente in array
Ich habe eine mongodb-Dokument wie
{
"_id" : ObjectId("54e66b2da7b5f3a92e09dc6c"),
"SomeMetric" : [
{
//some object
}
{
//some object
}
],
"FilterMetric" : [
{
"min" : "0.00",
"max" : "16.83",
"avg" : "0.00",
"class" : "s1"
},
{
"min" : "0.00",
"max" : "16.83",
"avg" : "0.00",
"class" : "s2"
},
{
"min" : "0.00",
"max" : "16.83",
"avg" : "0.00",
"class" : "s1"
},
{
"min" : "0.00",
"max" : "16.83",
"avg" : "0.00",
"class" : "s2"
}
]
}
In der Regel enthält es viele verschachtelte arrays wie dieses. Ich möchte project mit einer Metrik alleine, nur mit den arrays, die haben, die meinen Suchkriterien entsprechen.
Ich habe die Abfrage
db.sample.find(
{"filtermetric.class" : "s2"},{"filtermetric" : { $elemMatch : {class: "s2"}}}
)
Dieser gibt mir nur das erste Objekt im array. Das zweite Objekt mit der Klasse : s2 wird nicht zurückgegeben.
Wenn ich versuche
db.sample.find(
{"filtermetric" : { $elemMatch : {class: "s2"}}}
)
Es mir alle 4 Objekte in dem array.
Wie bekomme ich alle Objekte, die match-Kriterien in so einem Fall?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie nicht zurück mehrere Elemente eines Arrays, die Ihren Kriterien entsprechen, die in irgendeiner form eine grundlegende
.find()
Abfrage. Entsprechend mehr, als ein element, das Sie brauchen, um die Nutzung.Summe()
Methode statt.Der wesentliche Unterschied ist hier, dass die "Abfrage" genau das tut, was es tun sollte und Spiele "Dokumente", die sich Ihren Bedingungen. Sie können versuchen, mit der positions -
$
Betreiber innerhalb einer Projektion argument, aber die Regeln dort ist, dass es nur die "ersten" array-element, das der Abfrage entspricht Bedingungen.Um "filter" für mehrere array-Elemente, gehen Sie wie folgt vor:
In modernen Versionen von MongoDB, die version 2.6 oder höher Sie können dies tun, mit
$schwärzen
:Dass ist wahrscheinlich die effizienteste option, aber es ist rekursiv, so betrachten Sie Ihre Dokument-Struktur als erstes den gleichnamigen Feld nicht existieren kann mit einer anderen Bedingung auf jeder Ebene.
Möglicherweise sicherer, aber nur sinnvoll, wenn die Ergebnisse im array "wirklich einzigartig" ist, diese Technik mit
$anzeigen
und$setDifference
:Auch darauf hin, dass in den beiden
$group
und$project
operative pipeline-Stufen, die Sie müssen zum angeben aller Felder, die Sie wollen zurück in Ihre Ergebnis-Dokumente aus, die Bühne.Die Letzte Bemerkung ist, dass
$elemMatch
ist nicht erforderlich, wenn Sie nur Abfragen, den Wert einzelner Schlüssel in einem array. "Dot-notation" bevorzugt und empfohlen, wenn nur Zugriff auf einen einzelnen Schlüssel des array.$elemMatch
sollte nur dann notwendig sein, wenn "mehrere" Tasten, in die das Dokument innerhalb der array "element" brauchen, um eine Abfrage zu entsprechen Zustand.filtermetric
sollteFilterMetric
in diesen Antworten entsprechen dem Gehäuse des Feldes in der Probe-Dokument.