sql >> Database >  >> NoSQL >> MongoDB

MongoDB $grootte

In MongoDB is de $size aggregatiepijplijnoperator telt en retourneert het totale aantal items in een array.

De $size operator accepteert één argument. Het argument kan elke geldige expressie zijn die wordt omgezet in een array.

Voorbeeld

Stel dat we een verzameling hebben met de naam test met de volgende documenten:

{ "_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 ] }

We kunnen $size . gebruiken om het aantal items in de arrays in de respectievelijke data te retourneren velden.

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1, 2, 3, 4, 5 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Resultaat:

{ "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 }

Geneste arrays

De $size operator daalt niet af in geneste arrays en telt hun elementen niet. Het evalueert de array vanaf het hoogste niveau.

Stel dat we het volgende document in onze collectie hebben:

{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }

En we passen $size toe daarop:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 6 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Resultaat:

{ "data" : [ [ 1, 2 ], 3 ], "result" : 2 }

De geneste array wordt geteld als één element (ongeacht hoeveel elementen het bevat).

Verkeerde gegevenstypen

Het argument kan elke geldige expressie zijn, zolang het maar wordt omgezet in een array. Als het niet wordt omgezet in een array, wordt er een fout geproduceerd.

Stel dat we het volgende document hebben:

{ "_id" : 7, "data" : 3 }

De data veld wordt niet omgezet in een array.

Dit is wat er gebeurt als we $size toepassen naar dat veld:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 7 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Resultaat:

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

De foutmelding vertelt ons dat The argument to $size must be an array, but was of type: double .

Ontbrekende velden

Als het veld niet in het document bestaat, wordt een fout geretourneerd.

Stel dat we het volgende document hebben:

{ "_id" : 8 }

En we passen $size toe naar dat document:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 8 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result: { $size: [ "$data" ] }
          }
     }
   ]
)

Resultaat:

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

  1. Efficiënt pagineren in MongoDB met mgo

  2. Hoe kan ik MongoDB-logberichten in de console uitschakelen?

  3. MongoDB:Indexen-volgorde en zoekvolgorde moeten overeenkomen?

  4. Automatiseren en beheren van MongoDB in de cloud