MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

MongoDB $substrBytes

Di MongoDB, $substrBytes operator pipa agregasi mengembalikan substring string, berdasarkan indeks byte yang disandikan UTF-8 yang ditentukan.

Sintaks

Sintaksnya seperti ini:

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

Dimana:

  • <string expression> adalah string. Itu bisa berupa ekspresi apa pun yang valid selama itu diselesaikan menjadi string.
  • <byte index> adalah di mana untuk memulai substring. Itu bisa berupa ekspresi apa pun yang valid selama itu diselesaikan ke bilangan bulat atau angka non-negatif yang dapat direpresentasikan sebagai bilangan bulat.
  • <byte count> adalah berapa banyak byte yang harus dilanjutkan oleh substring. Itu bisa berupa ekspresi apa pun yang valid selama itu diselesaikan ke bilangan bulat atau angka non-negatif yang dapat direpresentasikan sebagai bilangan bulat.

Contoh

Bayangkan kita memiliki koleksi yang disebut tests dengan dokumen berikut:

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

Kita dapat menggunakan $substrBytes seperti ini:

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

Hasil:

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

Indeks dimulai dari nol, dan substring kita dimulai dari awal string, dan berlanjut selama tiga byte.

Dalam hal ini, kami menggunakan karakter bahasa Inggris dan setiap karakter adalah satu byte. Hal ini memudahkan kita untuk menghitung berapa banyak byte yang akan digunakan.

Mari kita jalankan contoh lain:

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()

Hasil:

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

Perhatikan di hasil ketiga kami, kami menetapkan lebih banyak byte daripada yang tersedia, tetapi hanya mengembalikan semua karakter ke akhir string.

Karakter Multi-Byte

Beberapa karakter menggunakan lebih dari satu byte. Ada yang menggunakan dua, ada yang menggunakan tiga, dan bahkan ada yang menggunakan empat.

Berikut ini contoh dokumen yang berisi sekumpulan simbol:

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

Masing-masing karakter ini menggunakan lebih dari satu byte. Ini berarti kita harus berhati-hati saat mengekstrak substring. Kita perlu memastikan bahwa titik awal kita tidak dimulai di tengah-tengah karakter. Jika ya, kesalahan akan terjadi. Demikian juga, kita perlu memastikan bahwa titik akhir kita tidak berakhir di tengah-tengah karakter.

Untuk saat ini, mari kita terapkan $substrBytes tanpa menimbulkan kesalahan:

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

Hasil:

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

Berdasarkan titik awal kami dari 0 dan panjang byte kami 5 , kami mendapatkan dua karakter di set hasil kami. Oleh karena itu kita dapat melihat bahwa dua karakter pertama menggunakan 5 byte.

Dalam contoh ini saya juga menggunakan $strLenBytes untuk mengembalikan jumlah total byte dalam string. Saya melakukan ini terutama untuk menunjukkan bahwa lima karakter menggunakan 14 byte (beberapa byte per karakter).

Berikut adalah contoh yang sedikit dimodifikasi yang mengembalikan masing-masing dari dua karakter yang dikembalikan:

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

Hasil:

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

Kita dapat melihat bahwa karakter pertama menggunakan dua byte dan karakter kedua menggunakan tiga.

Titik Awal Salah

Jika titik awal Anda berada di tengah-tengah karakter, akan terjadi kesalahan.

Contoh:

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

Hasil:

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

Kesalahan ini memberi tahu kita bahwa starting index is a UTF-8 continuation byte . Dengan kata lain, kami mencoba untuk memulai setengah jalan melalui karakter.

Titik Akhir Salah

Itu sama dengan titik akhir. Jika titik akhir Anda berada di tengah-tengah karakter, akan terjadi kesalahan.

Contoh:

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

Hasil:

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

Kali ini memberitahu kita bahwa 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. Buang Koleksi Mongo ke dalam format JSON

  2. Apa cara yang benar untuk memulai layanan mongod di linux / OS X?

  3. Bagaimana cara mendapatkan kembali dokumen yang diperbarui dari metode findOneAndUpdate?

  4. Dasar-dasar Replikasi Rantai MongoDB

  5. pymongo:MongoClient atau Koneksi