In MongoDB ist der $in
Der Aggregations-Pipeline-Operator gibt einen booleschen Wert zurück, der angibt, ob sich ein bestimmter Wert im Array befindet.
Der $in
Der Aggregations-Pipeline-Operator darf nicht mit $in
verwechselt werden Abfrageoperator, der die Dokumente auswählt, bei denen der Wert eines Felds einem beliebigen Wert im angegebenen Array entspricht.
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" ] }
Wir können den $in
verwenden Operator, um herauszufinden, ob die sizes
enthält den Wert L
.
Beispiel:
db.products.aggregate(
[
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Ergebnis:
{ "_id" : 1, "hasLarge" : false } { "_id" : 2, "hasLarge" : true } { "_id" : 3, "hasLarge" : true }
Zweites Argument muss in ein Array aufgelöst werden
Das zweite Argument von $in
Operator muss in ein Array aufgelöst werden. Wenn dies nicht der Fall ist, wird ein Fehler zurückgegeben.
Angenommen, wir fügen der Sammlung das folgende Dokument hinzu:
{ "_id" : 4, "prod" : "Shirt", "sizes" : "L" }
Beachten Sie, dass die sizes
field ist kein Array – es ist ein String.
Wenden wir $in
an zu diesem Dokument:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Ergebnis:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: string", "code" : 40081, "codeName" : "Location40081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
In diesem Fall die sizes
Feld enthält eine Zeichenkette. Daher wird ein Fehler zurückgegeben.
In diesem Beispiel verwende ich auch $in
mit dem $match
-Operator, um die Dokumente nach denjenigen zu filtern, an denen ich interessiert bin. Beachten Sie, dass dies den $in
verwendet Abfrageoperator-Syntax, die ein einzelnes Argument akzeptiert und nicht mit der Zwei-Argument-Syntax verwechselt werden darf.
Nullwerte
Dasselbe passiert, wenn das zweite Argument null
ist .
Lassen Sie uns das folgende Dokument zur Sammlung hinzufügen:
{ "_id" : 5, "prod" : "Jeans", "sizes" : null }
Folgendes passiert, wenn wir versuchen, $in
zu verwenden mit diesem Dokument:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Ergebnis:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: null", "code" : 40081, "codeName" : "Location40081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Gleicher Fehler.
Fehlende Felder
Genauso verhält es sich mit fehlenden Feldern.
Angenommen, wir fügen unserer Sammlung das folgende Dokument hinzu:
{ "_id" : 6, "prod" : "Shorts" }
Und jetzt versuchen wir, $in
anzuwenden zu den (nicht vorhandenen) sizes
Feld:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
hasLarge: { $in: [ "L", "$sizes" ] }
}
}
]
)
Ergebnis:
Error: command failed: { "ok" : 0, "errmsg" : "$in requires an array as a second argument, found: missing", "code" : 40081, "codeName" : "Location40081" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Reguläre Ausdrücke
Im Gegensatz zu $in
Abfrageoperator, der $in
Der Aggregations-Pipeline-Operator unterstützt die Verwendung von regulären Ausdrücken nicht.
Daher führt der folgende Code nicht zu einer Übereinstimmung:
db.products.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
hasLarge: { $in: [ /^X/, "$sizes" ] }
}
}
]
)
Ergebnis:
{ "_id" : 1, "hasLarge" : false } { "_id" : 2, "hasLarge" : false } { "_id" : 3, "hasLarge" : false }
Das Ergebnis für alle Dokumente ist false
, obwohl die sizes
-Feld in allen drei Dokumenten enthält Array-Elemente, die mit dem großen X
beginnen .