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 :
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
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 :
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