sql >> Base de Datos >  >> NoSQL >> MongoDB

MongoDB $tamaño

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