V MongoDB, $size
operátor agregačního kanálu spočítá a vrátí celkový počet položek v poli.
$size
operátor přijímá jeden argument. Argumentem může být jakýkoli platný výraz, který se překládá na pole.
Příklad
Předpokládejme, že máme kolekci nazvanou test
s následujícími dokumenty:
{ "_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 ] }
Můžeme použít $size
vrátit počet položek v polích v příslušných data
pole.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Výsledek:
{ "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 }
Vnořená pole
$size
operátor nesestupuje do vnořených polí a nepočítá jejich prvky. Vyhodnocuje pole od nejvyšší úrovně.
Předpokládejme, že máme ve sbírce následující dokument:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
A použijeme $size
k tomu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Výsledek:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Vnořené pole se počítá jako jeden prvek (bez ohledu na to, kolik prvků obsahuje).
Chybné datové typy
Argumentem může být jakýkoli platný výraz, pokud se překládá na pole. Pokud se nevyřeší na pole, dojde k chybě.
Předpokládejme, že máme následující dokument:
{ "_id" : 7, "data" : 3 }
data
pole se nerozkládá na pole.
Zde je to, co se stane, když použijeme $size
do tohoto pole:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Výsledek:
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
Chybová zpráva nám říká, že The argument to $size must be an array, but was of type: double
.
Chybějící pole
Pokud pole v dokumentu neexistuje, vrátí se chyba.
Předpokládejme, že máme následující dokument:
{ "_id" : 8 }
A použijeme $size
k tomuto dokumentu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Výsledek:
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