MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

MongoDB $in Aggregation Pipeline-Operator

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 .