In MongoDB ist der $nin
Der Abfrageoperator wählt die Dokumente aus, in denen sich der Feldwert nicht im angegebenen Array befindet oder in denen das Feld nicht vorhanden ist.
Beispiel
Angenommen, wir haben eine Sammlung namens products
mit folgenden Dokumenten:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 2, "prod" : "Hat", "sizes" : [ "S", "L", "XL" ] } { "_id" : 3, "prod" : "Cap", "sizes" : [ "XS", "S", "M", "L", "XL" ] } { "_id" : 4, "prod" : "Shirt", "sizes" : "L" } { "_id" : 5, "prod" : "Jeans", "sizes" : null } { "_id" : 6, "prod" : "Shorts" }
Wir können den $nin
verwenden Operator, um nur die Dokumente auszuwählen, die keine bestimmte _id
haben Werte.
Beispielcode:
db.products.find({
_id: { $nin: [ 1, 2, 3 ] }
})
Ergebnis:
{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" } { "_id" : 5, "prod" : "Jeans", "sizes" : null } { "_id" : 6, "prod" : "Shorts" }
In diesem Fall wollten wir nur Dokumente, die nicht eine _id
enthalten Wert von 1
, 2
, oder 3
.
Beispiel 2
Hier ist ein weiteres Beispiel. Dieses Mal verwenden wir $nin
gegen ein anderes Feld.
db.products.find({
sizes: { $nin: [ "L" ] }
})
Ergebnis:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 5, "prod" : "Jeans", "sizes" : null } { "_id" : 6, "prod" : "Shorts" }
In diesem Beispiel haben wir $nin
angewendet zu den sizes
Feld.
Beachten Sie, dass Dokument 6 zurückgegeben wurde, obwohl es keine sizes
hat Feld. Dies ist genau wie erwartet – wenn das Feld nicht existiert, ist es in $nin
enthalten Ergebnisse.
Der Vergleich verschiedener Typen wird gemäß der BSON-Vergleichsreihenfolge ausgewertet.
Aggregationsbeispiel
Wir können dieselbe Syntax verwenden, wenn wir $match
verwenden Aggregation-Pipeline-Betreiber.
Beispielcode:
db.products.aggregate(
[
{ $match: { _id: { $nin: [ 1, 2, 3 ] } } }
]
)
Ergebnis:
{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" } { "_id" : 5, "prod" : "Jeans", "sizes" : null } { "_id" : 6, "prod" : "Shorts" }
Und hier ist es wieder beim Abfragen der sizes
Feld:
db.products.aggregate(
[
{ $match: { sizes: { $nin: [ "L" ] } } }
]
)
Ergebnis:
{ "_id" : 1, "prod" : "Bat", "sizes" : [ "S", "M", "XL", "XXL" ] } { "_id" : 5, "prod" : "Jeans", "sizes" : null } { "_id" : 6, "prod" : "Shorts" }
Reguläre Ausdrücke
Sie können reguläre Ausdrücke in der Abfrage verwenden, indem Sie die Form /pattern/
verwenden .
Beispiel:
db.products.find({
sizes: { $nin: [ /^X/ ] }
})
Ergebnis:
{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" } { "_id" : 5, "prod" : "Jeans", "sizes" : null } { "_id" : 6, "prod" : "Shorts" }
In diesem Beispiel gebe ich alle Dokumente zurück, die keine sizes
haben Feld, das mit X
beginnt .