sql >> Databáze >  >> NoSQL >> MongoDB

MongoDB $slice

V MongoDB, $slice operátor agregačního kanálu vrátí podmnožinu pole.

Chcete-li použít $slice , určíte počet prvků, které se mají z pole vrátit. Můžete také zadat počáteční pozici, pro kterou se má podmnožina z pole převzít.

Příklad

Předpokládejme, že máme kolekci nazvanou test s následujícím dokumentem:

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

Můžeme použít $slice vzít podmnožinu z pole v data pole.

Pozitivní celé číslo

Zadání jedné kladné hodnoty určuje počáteční pozici od začátku pole.

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

Výsledek:

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

V tomto případě jsme uvedli kladné číslo 3 , a tak první tři prvky byly vráceny z pole.

Záporné celé číslo

Zadání jedné záporné hodnoty určuje počáteční pozici od konce pole.

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

Výsledek:

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

V tomto případě jsme vrátili poslední tři prvky z pole.

Všimněte si, že nemůžete zadat záporné celé číslo, když zadáte také počáteční pozici. Více o tom později.

Určete počáteční pozici

Máte také možnost určit výchozí pozici. Chcete-li to provést, zadejte jiné celé číslo před to druhé.

Pozitivní celé číslo

Zde je příklad použití kladného celého čísla pro počáteční pozici:

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

Výsledek:

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

V tomto případě jsme zadali počáteční pozici 2 a velikost řezu 3 .

Všimněte si, že pole jsou založena na nule, a proto je naše kladné celé číslo 2 vyústilo v operaci řezu začínající na třetí pozici.

Záporné celé číslo

Zde je příklad použití záporného celého čísla pro počáteční pozici:

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

Výsledek:

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

V tomto případě jsme zadali -4 , což vedlo k tomu, že operace řezu odpočítávala čtyři místa zpět od konce.

Příliš velké řezy

Poskytnutím velikosti řezu, která je větší než dostupné prvky v poli, budou vráceny pouze zbývající prvky pole.

Příklad:

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

Výsledek:

{ "result" : [ "Zebra" ] }

Zde jsme určili, že se mají vrátit tři prvky, i když jsme začali pouze o jednu pozici zpět od konce pole. V tomto případě byl vrácen pouze jeden prvek (poslední v poli).

Počáteční pozice mimo rozsah

Poskytnutí počáteční pozice, která je mimo rozsah pole, může vrátit některé prvky nebo prázdné pole. Vše závisí na poskytnutých hodnotách.

Zde je příklad, který vrací prázdné pole:

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

Výsledek:

{ "result" : [ ] }

To vrátilo prázdné pole, protože počáteční pozice byla 10 , i když existuje pouze 7 prvků v poli (a počet bude od 06 ).

Pokud však zadáme zápornou hodnotu, která je větší než velikost pole, začne řez od začátku pole.

Příklad:

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

Výsledek:

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

Záporný řez s počáteční pozicí

Jak již bylo zmíněno, nemůžete zadat záporné celé číslo, když zadáte také počáteční pozici. Pokud to uděláte, dojde k chybě.

Příklad:

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

Výsledek:

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. Sdružení MongoDB Many-to-Many

  2. MongoDB spojuje data uvnitř pole objektů

  3. Migrace MongoDB na DynamoDB, část 2

  4. Skript Redis Lua implementující CAS (check-and-set)?