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

MongoDB $størrelse

I MongoDB er $size aggregeringspipeline-operatør tæller og returnerer det samlede antal elementer i et array.

$size operatøren accepterer ét argument. Argumentet kan være et hvilket som helst gyldigt udtryk, der løses til en matrix.

Eksempel

Antag, at vi har en samling kaldet test med følgende dokumenter:

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

Vi kan bruge $size for at returnere antallet af elementer i arrays i de respektive data felter.

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

Resultat:

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

Indlejrede arrays

$size operatoren går ikke ned i indlejrede arrays og tæller deres elementer. Den evaluerer arrayet fra det øverste niveau.

Antag, at vi har følgende dokument i vores samling:

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

Og vi anvender $size til det:

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

Resultat:

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

Det indlejrede array tælles som ét element (uanset hvor mange elementer det indeholder).

Forkerte datatyper

Argumentet kan være et hvilket som helst gyldigt udtryk, så længe det løses til en matrix. Hvis det ikke løses til et array, produceres der en fejl.

Antag, at vi har følgende dokument:

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

data felt løses ikke til et array.

Her er, hvad der sker, når vi anvender $size til det felt:

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

Resultat:

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

Fejlmeddelelsen fortæller os, at The argument to $size must be an array, but was of type: double .

Manglende felter

Hvis feltet ikke findes i dokumentet, returneres en fejl.

Antag, at vi har følgende dokument:

{ "_id" : 8 }

Og vi anvender $size til det dokument:

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

Resultat:

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. Hvordan kontrollerer jeg, om redis kører, før jeg starter kolben (og starter den, hvis den ikke gør det)?

  2. Redis:Sådan får du adgang til Redis-logfilen

  3. Hvad er Express.js?

  4. Hvordan indstilles læsetimeout på node redis-klient?