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

MongoDB-$size

In MongoDB die $size Der Aggregations-Pipeline-Operator zählt die Gesamtzahl der Elemente in einem Array und gibt sie zurück.

Die $size Operator akzeptiert ein Argument. Das Argument kann ein beliebiger gültiger Ausdruck sein, der in ein Array aufgelöst wird.

Beispiel

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

{ "_id" : 1, "data" : [ ] }
{ "_id" : 2, "data" : [ "a" ] }
{ "_id" : 3, "data" : [ "a", "b" ] }
{ "_id" : 4, "data" : [ "a", "b", "c" ] }
{ "_id" : 5, "data" : [ 1, 1, 1, 1 ] }

Wir können $size verwenden um die Anzahl der Elemente in den Arrays in den jeweiligen data zurückzugeben Felder.

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Ergebnis:

{ "data" : [ ], "result" : 0 }
{ "data" : [ "a" ], "result" : 1 }
{ "data" : [ "a", "b" ], "result" : 2 }
{ "data" : [ "a", "b", "c" ], "result" : 3 }
{ "data" : [ 1, 1, 1, 1 ], "result" : 4 }

Verschachtelte Arrays

Die $size Operator steigt nicht in verschachtelte Arrays ab und zählt deren Elemente. Es wertet das Array von der obersten Ebene aus.

Angenommen, wir haben das folgende Dokument in unserer Sammlung:

{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }

Und wir wenden $size an dazu:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Ergebnis:

{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }

Das verschachtelte Array wird als ein Element gezählt (unabhängig davon, wie viele Elemente es enthält).

Falsche Datentypen

Das Argument kann ein beliebiger gültiger Ausdruck sein, solange er in ein Array aufgelöst wird. Wenn es nicht in ein Array aufgelöst wird, wird ein Fehler erzeugt.

Angenommen, wir haben das folgende Dokument:

{ "_id" : 7, "data" : 3 }

Die data Feld wird nicht in ein Array aufgelöst.

Folgendes passiert, wenn wir $size anwenden zu diesem Feld:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Ergebnis:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "The argument to $size must be an array, but was of type: double",
	"code" : 17124,
	"codeName" : "Location17124"
} : 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

Die Fehlermeldung sagt uns, dass The argument to $size must be an array, but was of type: double war .

Fehlende Felder

Wenn das Feld im Dokument nicht vorhanden ist, wird ein Fehler zurückgegeben.

Angenommen, wir haben das folgende Dokument:

{ "_id" : 8 }

Und wir wenden $size an zu diesem Dokument:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Ergebnis:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "The argument to $size must be an array, but was of type: missing",
	"code" : 17124,
	"codeName" : "Location17124"
} : 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