In MongoDB, il $size
l'operatore della pipeline di aggregazione conta e restituisce il numero totale di elementi in una matrice.
Il $size
l'operatore accetta un argomento. L'argomento può essere qualsiasi espressione valida che si risolve in una matrice.
Esempio
Supponiamo di avere una collezione chiamata test
con i seguenti documenti:
{ "_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 ] }
Possiamo usare $size
per restituire il numero di elementi negli array nei rispettivi data
campi.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Risultato:
{ "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 }
Matrici nidificate
Il $size
l'operatore non discende negli array nidificati e conta i loro elementi. Valuta l'array dal livello superiore.
Supponiamo di avere il seguente documento nella nostra collezione:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
E applichiamo $size
a quello:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Risultato:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
L'array nidificato viene contato come un elemento (indipendentemente dal numero di elementi che contiene).
Tipi di dati errati
L'argomento può essere qualsiasi espressione valida, purché si risolva in una matrice. Se non si risolve in un array, viene prodotto un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 7, "data" : 3 }
I data
il campo non si risolve in un array.
Ecco cosa succede quando applichiamo $size
a quel campo:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Risultato:
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
Il messaggio di errore ci dice che The argument to $size must be an array, but was of type: double
.
Campi mancanti
Se il campo non esiste nel documento, viene restituito un errore.
Supponiamo di avere il seguente documento:
{ "_id" : 8 }
E applichiamo $size
a quel documento:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Risultato:
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