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