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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
_asseexample@sqldat.com/mongo/shell/assert.js:639:17
example@sqldat.com/mongo/shell/assert.js:729:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/mongo/shell/collection.js:1058:12
@(shell):1:1