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

MongoDB $indexOfArray

In MongoDB der $indexOfArray Der Aggregations-Pipeline-Operator durchsucht ein Array nach einem Vorkommen eines bestimmten Werts und gibt den Array-Index des ersten Vorkommens zurück.

Syntax

Die Syntax sieht so aus:

{ $indexOfArray: [ <array expression>, <search expression>, <start>, <end> ] }

Wo:

  • <array expression> ist das zu durchsuchende Array.
  • <search expression> ist der Wert, den Sie im Array finden möchten.
  • <start> ist ein optionales Argument, das einen Startpunkt angibt, nach dem im Array gesucht werden soll. Kann ein beliebiger gültiger Ausdruck sein, der sich in eine nicht negative ganze Zahl auflösen lässt.
  • <end> ist ein optionales Argument, das eine Endindexposition für die Suche angibt. Kann ein beliebiger gültiger Ausdruck sein, der sich in eine nicht negative ganze Zahl auflösen lässt.

In MongoDB sind Arrays nullbasiert, sodass die Indexzählung bei null beginnt (0 ).

Wenn der angegebene Wert nicht gefunden wird, $indexOfArray gibt -1 zurück .

Wenn mehrere Instanzen des angegebenen Werts vorhanden sind, wird nur die erste zurückgegeben.

Beispiel

Angenommen, wir haben eine Sammlung namens products mit folgenden Dokumenten:

{ "_id" : 1, "prod" : "Bat", "sizes" : [ "XS", "M", "L" ] }
{ "_id" : 2, "prod" : "Hat", "sizes" : [ "XS", "S", "L", "XL" ] }
{ "_id" : 3, "prod" : "Cap", "sizes" : [ "XXS", "XS", "M", "XL" ] }
{ "_id" : 4, "prod" : "Zap", "sizes" : [ 10, 12, 15 ] }
{ "_id" : 5, "prod" : "Tap", "sizes" : [ 15, 16, 20 ] }

Hier ist ein Beispiel für die Anwendung von $indexOfArray zu diesen Dokumenten:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

In den ersten beiden Dokumenten wurde der Suchwert an Position 0 gefunden (Arrays sind nullbasiert).

Im dritten Dokument wurde es an Position 1 gefunden . Beachten Sie, dass die Suche nach einer exakten Übereinstimmung erfolgte. Position 0 wurde nicht zurückgegeben , obwohl der Wert an Position 0 enthält den Suchwert (also XXS enthält XS ).

Der Suchwert wurde in den letzten beiden Dokumenten nicht gefunden, also -1 wurde zurückgegeben.

Hier ist ein weiteres Beispiel, außer dass wir dieses Mal nach einem numerischen Wert suchen:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15 ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : 0 }

Geben Sie eine Startposition an

Sie können ein drittes Argument angeben, um eine Startindexposition für die Suche anzugeben.

Beispiel:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", 15, 1 ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ 10, 12, 15 ], "result" : 2 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }

In diesem Fall wurde der Suchausdruck im zweiten Dokument (Dokument 5) nicht gefunden. Das liegt daran, dass wir die Suche an Position 1 gestartet haben , und obwohl dieses Dokument den Suchausdruck enthält, befindet es sich an Position 0 (vor der Startposition für die Suche).

Geben Sie eine Endposition an

Sie können auch ein viertes Argument angeben, um die letzte Indexposition für die Suche anzugeben.

Wenn Sie dieses Argument angeben, müssen Sie auch eine Ausgangsposition angeben. Andernfalls wird dieses Argument als Ausgangspunkt interpretiert.

Beispiel:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 1 ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }

Das dritte Dokument gab -1 zurück was bedeutet, dass der Suchausdruck nicht gefunden wurde.

Folgendes passiert, wenn wir die Endindexposition um 1 erhöhen:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS", 0, 2 ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ "XS", "M", "L" ], "result" : 0 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : 0 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : 1 }

Dieses Mal wurde der Wert eingeschlossen und seine Indexposition zurückgegeben.

Leere Arrays

Das Durchsuchen eines leeren Arrays gibt -1 zurück .

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ ], "result" : -1 }

Fehlende Felder

Wenn sich das Feld nicht im Dokument befindet, $indexOfArray gibt null zurück .

Angenommen, wir haben das folgende Dokument:

{ "_id" : 8, "prod" : "Map" }

Folgendes passiert, wenn wir $indexOfArray anwenden :

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Ergebnis:

{ "result" : null }

Nullwerte

Wenn der Array-Ausdruck null ist (anstelle eines Arrays), $indexOfArray gibt null zurück .

Angenommen, wir haben das folgende Dokument:

{ "_id" : 7, "prod" : "Lap", "sizes" : null }

Folgendes passiert, wenn wir $indexOfArray anwenden :

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XS" ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : null, "result" : null }

Wenn der Suchausdruck jedoch null ist , ist das Ergebnis -1 , es sei denn, der Array-Ausdruck ist auch null oder sein Feld fehlt:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5, 6, 7, 8 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", null ] }
          }
     }
   ]
)

Ergebnis:

{ "sizes" : [ "XS", "M", "L" ], "result" : -1 }
{ "sizes" : [ "XS", "S", "L", "XL" ], "result" : -1 }
{ "sizes" : [ "XXS", "XS", "M", "XL" ], "result" : -1 }
{ "sizes" : [ 10, 12, 15 ], "result" : -1 }
{ "sizes" : [ 15, 16, 20 ], "result" : -1 }
{ "sizes" : [ ], "result" : -1 }
{ "sizes" : null, "result" : null }
{ "result" : null }

Falscher Datentyp

Wenn der Array-Ausdruck den falschen Datentyp hat, $indexOfArray gibt einen Fehler zurück.

Angenommen, wir haben das folgende Dokument:

{ "_id" : 9, "prod" : "Box", "sizes" : "XXL" }

Folgendes passiert, wenn wir $indexOfArray anwenden zu diesem Dokument:

db.products.aggregate(
   [
     { $match: { _id: { $in: [ 9 ] } } },
     {
       $project:
          {
            _id: 0,
            sizes: 1,
            result: { $indexOfArray: [ "$sizes", "XXL" ] }
          }
     }
   ]
)

Ergebnis:

uncaught exception: Error: command failed: {
	"ok" : 0,
	"errmsg" : "$indexOfArray requires an array as a first argument, found: string",
	"code" : 40090,
	"codeName" : "Location40090"
} : aggregate failed :
[email protected]/mongo/shell/utils.js:25:13
[email protected]/mongo/shell/assert.js:18:14
[email protected]/mongo/shell/assert.js:639:17
[email protected]/mongo/shell/assert.js:729:16
[email protected]/mongo/shell/db.js:266:5
[email protected]/mongo/shell/collection.js:1058:12
@(shell):1:1

Wie die Fehlermeldung besagt, benötigt $indexOfArray requires an array as a first argument .