I MongoDB, $size
aggregeringspipeline-operatör räknar och returnerar det totala antalet objekt i en array.
$size
operatören accepterar ett argument. Argumentet kan vara vilket giltigt uttryck som helst som löser sig till en array.
Exempel
Anta att vi har en samling som heter test
med följande dokument:
{ "_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 använda $size
för att returnera antalet objekt i arrayerna i respektive data
fält.
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 }
Inkapslade arrayer
$size
operatorn går inte ner i kapslade arrayer och räknar deras element. Den utvärderar arrayen från översta nivån.
Anta att vi har följande dokument i vår samling:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Och vi tillämpar $size
till det:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultat:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Den kapslade arrayen räknas som ett element (oavsett hur många element den innehåller).
Fel datatyper
Argumentet kan vara vilket giltigt uttryck som helst, så länge det löser sig till en array. Om det inte löser sig till en array skapas ett fel.
Anta att vi har följande dokument:
{ "_id" : 7, "data" : 3 }
data
fältet löser sig inte till en array.
Det här är vad som händer när vi använder $size
till det fältet:
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
Felmeddelandet talar om för oss att The argument to $size must be an array, but was of type: double
.
Fält saknas
Om fältet inte finns i dokumentet returneras ett felmeddelande.
Anta att vi har följande dokument:
{ "_id" : 8 }
Och vi tillämpar $size
till det dokumentet:
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