MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

MongoDB $slice

В MongoDB, $slice Операторът на конвейера за агрегиране връща подмножество от масив.

За да използвате $slice , посочвате броя на елементите, които да се върнат от масива. Можете също да посочите начална позиция, за която да вземете подмножеството от масива.

Пример

Да предположим, че имаме колекция, наречена test със следния документ:

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

Можем да използваме $slice за да вземете подмножество от масива в data поле.

Цяло положително число

Предоставянето на една положителна стойност определя началната позиция от началото на масива.

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

Резултат:

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

В този случай предоставихме положително число от 3 , и така първите три елемента са върнати от масива.

Цяло отрицателно число

Предоставянето на една отрицателна стойност определя началната позиция от края от масива.

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

Резултат:

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

В този случай върнахме последните три елемента от масива.

Обърнете внимание, че не можете да зададете отрицателно цяло число, когато посочите и начална позиция. Повече за това по-късно.

Посочете начална позиция

Освен това имате възможност да посочите начална позиция. За да направите това, посочете друго цяло число преди другото.

Цяло положително число

Ето пример за използване на положително цяло число за начална позиция:

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

Резултат:

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

В този случай посочихме начална позиция 2 и размер на парче 3 .

Имайте предвид, че масивите са базирани на нула и следователно нашето положително цяло число от 2 доведе до операцията за срязване, започваща от трета позиция.

Цяло отрицателно число

Ето пример за използване на отрицателно цяло число за начална позиция:

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

Резултат:

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

В този случай посочихме -4 , което доведе до операцията с отрязък, отброяваща четири места назад от края.

Огромни резени

Предоставянето на размер на отрязък, който е по-голям от наличните елементи в масива, води до връщане само на останалите елементи на масива.

Пример:

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

Резултат:

{ "result" : [ "Zebra" ] }

Тук уточнихме, че трябва да бъдат върнати три елемента, въпреки че започнахме само една позиция назад от края на масива. В този случай е върнат само един елемент (последният в масива).

Начална позиция извън обхват

Предоставянето на начална позиция, която е извън обхвата на масива, може да върне някои елементи или празен масив. Всичко зависи от предоставените стойности.

Ето пример, който връща празен масив:

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

Резултат:

{ "result" : [ ] }

Това върна празен масив, защото началната позиция беше 10 , въпреки че има само 7 елементи в масива (и броят ще започне от 0 до 6 ).

Ако обаче предоставим отрицателна стойност, която е по-голяма от размера на масива, отрязъкът започва от началото на масива.

Пример:

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

Резултат:

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

Отрицателен отрязък с начална позиция

Както споменахме, не можете да зададете отрицателно цяло число, когато посочите и начална позиция. Това води до грешка.

Пример:

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

Резултат:

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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Декодиране на регистрационните файлове за грешки в MongoDB

  2. Защита на базата данни 101:Разбиране на привилегиите за достъп до база данни

  3. MongoDB регистрира всички заявки

  4. MongoDB $push

  5. Тествайте празен низ в mongodb и pymongo