In MongoDB is de $size
aggregatiepijplijnoperator telt en retourneert het totale aantal items in een array.
De $size
operator accepteert één argument. Het argument kan elke geldige expressie zijn die wordt omgezet in een array.
Voorbeeld
Stel dat we een verzameling hebben met de naam test
met de volgende documenten:
{ "_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 ] }
We kunnen $size
. gebruiken om het aantal items in de arrays in de respectievelijke data
te retourneren velden.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultaat:
{ "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 }
Geneste arrays
De $size
operator daalt niet af in geneste arrays en telt hun elementen niet. Het evalueert de array vanaf het hoogste niveau.
Stel dat we het volgende document in onze collectie hebben:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
En we passen $size
toe daarop:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultaat:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
De geneste array wordt geteld als één element (ongeacht hoeveel elementen het bevat).
Verkeerde gegevenstypen
Het argument kan elke geldige expressie zijn, zolang het maar wordt omgezet in een array. Als het niet wordt omgezet in een array, wordt er een fout geproduceerd.
Stel dat we het volgende document hebben:
{ "_id" : 7, "data" : 3 }
De data
veld wordt niet omgezet in een array.
Dit is wat er gebeurt als we $size
toepassen naar dat veld:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultaat:
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
De foutmelding vertelt ons dat The argument to $size must be an array, but was of type: double
.
Ontbrekende velden
Als het veld niet in het document bestaat, wordt een fout geretourneerd.
Stel dat we het volgende document hebben:
{ "_id" : 8 }
En we passen $size
toe naar dat document:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultaat:
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