MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

MongoDB $ dimensione

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