En MongoDB, el $size
El operador de canalización de agregación cuenta y devuelve el número total de elementos en una matriz.
El $size
operador acepta un argumento. El argumento puede ser cualquier expresión válida que se resuelva en una matriz.
Ejemplo
Supongamos que tenemos una colección llamada test
con los siguientes documentos:
{ "_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 ] }
Podemos usar $size
para devolver el número de elementos en las matrices en los respectivos data
campos.
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultado:
{ "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 }
Matrices anidadas
El $size
El operador no desciende a matrices anidadas y cuenta sus elementos. Evalúa la matriz desde el nivel superior.
Supongamos que tenemos el siguiente documento en nuestra colección:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
Y aplicamos $size
a eso:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultado:
{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }
La matriz anidada se cuenta como un elemento (independientemente de cuántos elementos contenga).
Tipos de datos incorrectos
El argumento puede ser cualquier expresión válida, siempre que se resuelva en una matriz. Si no se resuelve en una matriz, se produce un error.
Supongamos que tenemos el siguiente documento:
{ "_id" : 7, "data" : 3 }
Los data
el campo no se resuelve en una matriz.
Esto es lo que sucede cuando aplicamos $size
a ese campo:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultado:
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
El mensaje de error nos dice que The argument to $size must be an array, but was of type: double
.
Campos faltantes
Si el campo no existe en el documento, se devuelve un error.
Supongamos que tenemos el siguiente documento:
{ "_id" : 8 }
Y aplicamos $size
a ese documento:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 8 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $size: [ "$data" ] }
}
}
]
)
Resultado:
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