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
.