sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB $storlek

I MongoDB, $size aggregeringspipeline-operatör räknar och returnerar det totala antalet objekt i en array.

$size operatören accepterar ett argument. Argumentet kan vara vilket giltigt uttryck som helst som löser sig till en array.

Exempel

Anta att vi har en samling som heter test med följande dokument:

{ "_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 använda $size för att returnera antalet objekt i arrayerna i respektive data fält.

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 }

Inkapslade arrayer

$size operatorn går inte ner i kapslade arrayer och räknar deras element. Den utvärderar arrayen från översta nivån.

Anta att vi har följande dokument i vår samling:

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

Och vi tillämpar $size till det:

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

Resultat:

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

Den kapslade arrayen räknas som ett element (oavsett hur många element den innehåller).

Fel datatyper

Argumentet kan vara vilket giltigt uttryck som helst, så länge det löser sig till en array. Om det inte löser sig till en array skapas ett fel.

Anta att vi har följande dokument:

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

data fältet löser sig inte till en array.

Det här är vad som händer när vi använder $size till det fältet:

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

Felmeddelandet talar om för oss att The argument to $size must be an array, but was of type: double .

Fält saknas

Om fältet inte finns i dokumentet returneras ett felmeddelande.

Anta att vi har följande dokument:

{ "_id" : 8 }

Och vi tillämpar $size till det dokumentet:

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. Hur kör man en Redis-server OCH en annan applikation i Docker?

  2. explain() i Mongodb:skillnader mellan nscanned och nscannedObjects

  3. Redis eller Mongo för att avgöra om ett nummer faller inom intervallen?

  4. Vad är Redis pubsub och hur använder jag det?