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

MongoDB $slice

I MongoDB er $slice aggregeringspipeline-operatør returnerer en delmængde af et array.

For at bruge $slice , angiver du antallet af elementer, der skal returneres fra arrayet. Du kan også angive en startposition, som du vil tage delsættet for fra arrayet.

Eksempel

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

{ "_id" : 1, "data" : [ "Aardvark", "Buffalo", "Cat", "Dog", "Horse", "Gorilla", "Zebra" ] }

Vi kan bruge $slice at tage et undersæt fra arrayet i data felt.

Positivt heltal

Angivelse af en enkelt positiv værdi bestemmer startpositionen fra starten af ​​arrayet.

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }

I dette tilfælde har vi angivet et positivt tal på 3 , og så de første tre elementer blev returneret fra arrayet.

Negativt heltal

Angivelse af en enkelt negativ værdi bestemmer startpositionen fra slutningen af arrayet.

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ "Horse", "Gorilla", "Zebra" ] }

I dette tilfælde returnerede vi de sidste tre elementer fra arrayet.

Bemærk, at du ikke kan angive et negativt heltal, når du også angiver en startposition. Mere om dette senere.

Angiv en startposition

Du har også mulighed for at angive en startposition. For at gøre dette skal du angive et andet heltal før det andet.

Positivt heltal

Her er et eksempel på brug af et positivt heltal til startpositionen:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 2, 3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ "Cat", "Dog", "Horse" ] }

I dette tilfælde specificerede vi en startposition på 2 og en skivestørrelse på 3 .

Bemærk, at arrays er nul-baserede, og derfor vores positive heltal 2 resulterede i, at skiveoperationen startede ved den tredje position.

Negativt heltal

Her er et eksempel på brug af et negativt heltal til startpositionen:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -4, 3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ "Dog", "Horse", "Gorilla" ] }

I dette tilfælde specificerede vi -4 , hvilket resulterede i, at skiveoperationen tæller fire pladser tilbage fra slutningen.

Overstore skiver

Angivelse af en udsnitsstørrelse, der er større end de tilgængelige elementer i arrayet, resulterer i, at kun de resterende array-elementer returneres.

Eksempel:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -1, 3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ "Zebra" ] }

Her specificerede vi, at tre elementer skulle returneres, selvom vi kun startede en position tilbage fra enden af ​​arrayet. I dette tilfælde blev der kun returneret ét element (det sidste i arrayet).

Udenfor rækkevidde startposition

Angivelse af en startposition, der er uden for rækkevidden af ​​arrayet, kan returnere nogle elementer eller et tomt array. Det hele afhænger af de værdier, der leveres.

Her er et eksempel, der returnerer et tomt array:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 10, 3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ ] }

Dette returnerede et tomt array, fordi startpositionen var 10 , selvom der kun er 7 elementer i arrayet (og antallet ville gå fra 0 til 6 ).

Men hvis vi angiver en negativ værdi, der er større end matrixstørrelsen, starter udsnittet fra starten af ​​matrixen.

Eksempel:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", -10, 3 ] }
          }
     }
   ]
)

Resultat:

{ "result" : [ "Aardvark", "Buffalo", "Cat" ] }

Negativ udsnit med en startposition

Som nævnt kan du ikke angive et negativt heltal, når du også angiver en startposition. Dette resulterer i en fejl.

Eksempel:

db.test.aggregate(
   [
     {
       $project:
          {
            _id: 0,
            result: { $slice: [ "$data", 4, -3 ] }
          }
     }
   ]
)

Resultat:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "Third argument to $slice must be positive: -3",
	"code" : 28729,
	"codeName" : "Location28729"
} : 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. Indkapsling af Unicode fra redis

  2. Hvordan opretter man en distribueret lås med Redis?

  3. Kan redis pipeline flere kommandoer, der afhænger af tidligere?

  4. Sådan sikrer du dine Open Source-databaser med ClusterControl