I MongoDB er $size
aggregeringspipeline-operatør tæller og returnerer det samlede antal elementer i et array.
$size
operatøren accepterer ét argument. Argumentet kan være et hvilket som helst gyldigt udtryk, der løses til en matrix.
Eksempel
Antag, at vi har en samling kaldet test
med følgende dokumenter:
{ "_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 ] }
Vi kan bruge $size
for at returnere antallet af elementer i arrays i de respektive data
felter.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultat:
{ "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 }
Indlejrede arrays
$size
operatoren går ikke ned i indlejrede arrays og tæller deres elementer. Den evaluerer arrayet fra det øverste niveau.
Antag, at vi har følgende dokument i vores samling:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Og vi anvender $size
til det:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultat:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Det indlejrede array tælles som ét element (uanset hvor mange elementer det indeholder).
Forkerte datatyper
Argumentet kan være et hvilket som helst gyldigt udtryk, så længe det løses til en matrix. Hvis det ikke løses til et array, produceres der en fejl.
Antag, at vi har følgende dokument:
{ "_id" : 7, "data" : 3 }
data
felt løses ikke til et array.
Her er, hvad der sker, når vi anvender $size
til det felt:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultat:
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
Fejlmeddelelsen fortæller os, at The argument to $size must be an array, but was of type: double
.
Manglende felter
Hvis feltet ikke findes i dokumentet, returneres en fejl.
Antag, at vi har følgende dokument:
{ "_id" : 8 }
Og vi anvender $size
til det dokument:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultat:
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