Ich habe eine MongoDB-Sammlung mit Dokumenten im folgenden Format:
{
"_id" : ObjectId("4e8ae86d08101908e1000001"),
"name" : ["Name"],
"zipcode" : ["2223"]
}
{
"_id" : ObjectId("4e8ae86d08101908e1000002"),
"name" : ["Another ", "Name"],
"zipcode" : ["2224"]
}
Ich kann derzeit Dokumente abrufen, die einer bestimmten Arraygröße entsprechen:
db.accommodations.find({ name : { $size : 2 }})
Dadurch werden die Dokumente mit 2 Elementen im name
Array korrekt zurückgegeben . Ich kann jedoch keinen $gt
Befehl ausführen, um alle Dokumente zurückzugeben, bei denen das name
Feld eine Arraygröße von mehr als 2 hat:
db.accommodations.find({ name : { $size: { $gt : 1 } }})
Wie kann ich alle Dokumente mit einem name
Array mit einer Größe größer als eins auswählen (vorzugsweise ohne die aktuelle Datenstruktur ändern zu müssen)?
mongodb
mongodb-query
Emson
quelle
quelle
Antworten:
Aktualisieren:
Für Mongodb-Versionen 2.2+ ist dies eine effizientere Methode, die von @JohnnyHK in einer anderen Antwort beschrieben wird .
1.Mit $ where
Aber...
2.Erstellen Sie ein zusätzliches Feld
NamesArrayLength
, aktualisieren Sie es mit der Länge des Namensarrays und verwenden Sie es dann in Abfragen:Es ist eine bessere Lösung und funktioniert viel schneller (Sie können einen Index dafür erstellen).
quelle
$where
, es ist sehr flexibel.In MongoDB 2.2+ gibt es jetzt eine effizientere Möglichkeit, numerische Array-Indizes in Abfrageobjektschlüsseln zu verwenden.
Sie können diese Abfrage mit einem Index unterstützen, der einen Teilfilterausdruck verwendet (erfordert 3.2+):
quelle
{'Name Field.1': {$exists: true}}
.name
finden, in denen mindestens 1 Element enthalten ist, aber das OP suchte nach mehr als 1.Ich glaube, dies ist die schnellste Abfrage, die Ihre Frage beantwortet, da keine interpretierte
$where
Klausel verwendet wird:Es bedeutet "alle Dokumente außer denen ohne Namen (entweder nicht vorhanden oder leeres Array) oder mit nur einem Namen."
Prüfung:
quelle
{'name.1': {$exists: true}}
'name.1': {$exists: true}}
und auch, weil dies für "1" festSie können auch Aggregat verwenden:
// Sie fügen dem Transitdokument "size_of_name" hinzu und filtern damit die Größe des Namens
quelle
Versuchen Sie so etwas zu tun:
1 ist die Nummer. Wenn Sie einen Datensatz größer als 50 abrufen möchten, führen Sie ArrayName.50 aus. Danke.
quelle
Keines der oben genannten hat bei mir funktioniert. Dieser hat es getan, also teile ich es:
quelle
Sie können verwenden $ expr (3.6 Mongo-Versionsoperator) verwenden, um Aggregationsfunktionen in regulären Abfragen zu verwenden.
Vergleichen
query operators
vsaggregation comparison operators
.quelle
$name
eines Arrays übergeben, das ein Unterdokument ist, beispielsweise in einem "Personen" -Datensatzpassport.stamps
? Ich habe verschiedene Zitatkombinationen ausprobiert, aber ich verstehe"The argument to $size must be an array, but was of type: string/missing"
.db.col.find({$expr:{$gt:[{$size:{$ifNull:["$passport.stamps", []]}}, 1]}})
quelle
MongoDB 3.6 enthält $ expr https://docs.mongodb.com/manual/reference/operator/query/expr/
Sie können $ expr verwenden, um einen Ausdruck innerhalb einer $ match auszuwerten oder zu finden.
oder finden
quelle
Ich habe diese Lösung gefunden, um Elemente mit einem Array-Feld zu finden, das größer als eine bestimmte Länge ist
Das erste $ match-Aggregat verwendet ein Argument, das für alle Dokumente gilt. Wenn leer, würde ich bekommen
quelle
Ich kenne die alte Frage, aber ich versuche dies mit $ gte und $ size in find. Ich denke zu finden () ist schneller.
quelle
Obwohl die obigen Antworten alle funktionieren, war das, was Sie ursprünglich versucht haben, der richtige Weg, aber Sie haben nur die Syntax rückwärts (wechseln Sie "$ size" und "$ gt").
Richtig:
Falsch:
quelle