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

MongoDB $substrBytes

В MongoDB, $substrBytes Операторът на конвейера за агрегиране връща подниз на низ въз основа на посочените индекси на байтове, кодирани в UTF-8.

Синтаксис

Синтаксисът е така:

{ $substrBytes: [ <string expression>, <byte index>, <byte count> ] }

Къде:

  • <string expression> е низът. Може да бъде всеки валиден израз, стига да се разрешава в низ.
  • <byte index> е откъде да започне поднизът. Може да бъде всеки валиден израз, стига да се разреши до неотрицателно цяло число или число, което може да бъде представено като цяло число.
  • <byte count> е за колко байта трябва да продължи поднизът. Може да бъде всеки валиден израз, стига да се разреши до неотрицателно цяло число или число, което може да бъде представено като цяло число.

Пример

Представете си, че имаме колекция, наречена tests със следния документ:

{ "_id" : 1, "data" : "Red Firetruck" }

Можем да използваме $substrBytes така:

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

Резултат:

{ "data" : "Red Firetruck", "result" : "Red" }

Индексът започва от нула и така нашият подниз започва в началото на низа и продължава три байта.

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

Нека изпълним друг пример:

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 1 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            result_1: { $substrBytes: [ "$data", 4, 4 ] },
            result_2: { $substrBytes: [ "$data", 8, 5 ] },
            result_3: { $substrBytes: [ "$data", 8, 20 ] }
          }
     }
   ]
).pretty()

Резултат:

{
	"data" : "Red Firetruck",
	"result_1" : "Fire",
	"result_2" : "truck",
	"result_3" : "truck"
}

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

Многобайтови символи

Някои знаци използват повече от един байт. Някои използват две, други три, а някои дори четири.

Ето пример за документ, който съдържа куп символи:

{ "_id" : 2, "data" : "©♡★✪☆" }

Всеки от тези знаци използва повече от един байт. Това означава, че трябва да бъдем внимателни, когато извличаме подниз. Трябва да сме сигурни, че нашата отправна точка не започва от средата на един герой. Ако е така, ще възникне грешка. По същия начин трябва да гарантираме, че нашата крайна точка не свършва по средата на даден герой.

Засега нека приложим $substrBytes без да доведе до грешка:

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

Резултат:

{ "data" : "©♡★✪☆", "bytes" : 14, "result" : "©♡" }

Въз основа на нашата начална точка от 0 и нашата дължина на байта от 5 , получаваме два знака в нашия набор от резултати. Следователно можем да видим, че първите два знака използват 5 байта.

В този пример също използвах $strLenBytes за да върне общия брой байтове в низа. Направих това главно, за да покажа, че петте знака използват 14 байта (много байта на знак).

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

db.test.aggregate(
   [
     { $match: { _id: { $in: [ 2 ] } } },
     {
       $project:
          {
            _id: 0,
            data: 1,
            r1: { $substrBytes: [ "$data", 0, 2 ] },
            r2: { $substrBytes: [ "$data", 2, 3 ] }
          }
     }
   ]
)

Резултат:

{ "data" : "©♡★✪☆", "r1" : "©", "r2" : "♡" }

Можем да видим, че първият символ използва два байта, а вторият символ използва три.

Грешна начална точка

Ако началната ви точка е по средата на даден знак, възниква грешка.

Пример:

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

Резултат:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$substrBytes:  Invalid range, starting index is a UTF-8 continuation byte.",
	"code" : 28656,
	"codeName" : "Location28656"
} : 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

Тази грешка ни казва, че starting index is a UTF-8 continuation byte . С други думи, опитахме се да започнем от средата на един герой.

Грешна крайна точка

Същото е и с крайната точка. Ако крайната ви точка е по средата на даден знак, възниква грешка.

Пример:

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

Резултат:

Error: command failed: {
	"ok" : 0,
	"errmsg" : "$substrBytes:  Invalid range, ending index is in the middle of a UTF-8 character.",
	"code" : 28657,
	"codeName" : "Location28657"
} : 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

Този път ни казва, че ending index is in the middle of a UTF-8 character .


  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Как да се присъединя към заявка в mongodb?

  2. Използване на S3 като база данни срещу база данни (напр. MongoDB)

  3. MongoDB insertMany()

  4. Първи стъпки с PHP и MongoDB

  5. NestJS:Как да внедрите потребителско удостоверяване, базирано на сесия