Di MongoDB, $indexOfBytes
operator pipa agregasi mencari string untuk kemunculan substring dan mengembalikan indeks byte UTF-8 dari kemunculan pertama.
Indeks byte UTF berbasis nol (yaitu dimulai dari 0
).
Sintaks
Sintaksnya seperti ini:
{ $indexOfBytes: [ <string expression>, <substring expression>, <start>, <end> ] }
Dimana:
<string expression>
adalah string yang akan dicari.<substring expression>
adalah substring yang ingin Anda temukan dalam string.<start>
adalah argumen opsional yang menentukan posisi indeks awal untuk pencarian. Dapat berupa ekspresi valid apa pun yang menghasilkan bilangan integral non-negatif.<end>
adalah argumen opsional yang menentukan posisi indeks akhir untuk pencarian. Dapat berupa ekspresi valid apa pun yang menghasilkan bilangan integral non-negatif.
Jika nilai yang ditentukan tidak ditemukan, $indexOfBytes
mengembalikan -1
.
Jika ada beberapa contoh dari nilai yang ditentukan, hanya yang pertama yang dikembalikan.
Contoh
Misalkan kita memiliki koleksi yang disebut test
dengan dokumen sebagai berikut:
{ "_id" : 1, "data" : "c 2021" } { "_id" : 2, "data" : "© 2021" } { "_id" : 3, "data" : "ไม้เมือง" }
Berikut ini contoh penerapan $indexOfBytes
ke dokumen-dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "2021" ] }
}
}
]
)
Hasil:
{ "data" : "c 2021", "result" : 2 } { "data" : "© 2021", "result" : 3 } { "data" : "ไม้เมือง", "result" : -1 }
Kita dapat melihat bahwa dua dokumen pertama menghasilkan hasil yang berbeda, meskipun substring tampaknya berada pada posisi yang sama untuk setiap dokumen. Pada dokumen pertama, substring ditemukan pada posisi indeks byte 2
, sedangkan dokumen kedua memilikinya di 3
.
Alasannya adalah bahwa simbol hak cipta (©
) di dokumen kedua membutuhkan 2 byte. c
karakter (dalam dokumen pertama) hanya menggunakan 1 byte. Karakter spasi juga menggunakan 1 byte.
Hasil dari $indexOfBytes
berbasis nol (indeks dimulai dari 0
), dan akhirnya kita mendapatkan hasil 2
dan 3
masing-masing.
Mengenai dokumen ketiga, substringnya tidak ditemukan sama sekali, sehingga hasilnya adalah -1
.
Berikut ini contoh lain, kecuali kali ini kami mencari karakter Thailand:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1, 2, 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "เ" ] }
}
}
]
)
Hasil:
{ "data" : "c 2021", "result" : -1 } { "data" : "© 2021", "result" : -1 } { "data" : "ไม้เมือง", "result" : 9 }
Dalam hal ini, kami mencari karakter yang muncul di posisi ketiga dalam dokumen ketiga, dan indeks byte UTF-8-nya kembali sebagai 9
.
Ini karena dalam hal ini, setiap karakter menggunakan 3 byte. Tetapi karakter kedua memiliki tanda diakritik, yang juga 3 byte. Oleh karena itu, dua karakter pertama (termasuk diakritik) menggunakan 9 byte. Mengingat pengindeksan berbasis nol, indeks byte UTF-8 mereka berkisar dari 0
ke 8
. Artinya karakter ketiga dimulai pada posisi 9
.
Lihat MongoDB $strLenBytes
untuk contoh yang mengembalikan jumlah byte untuk setiap karakter dalam string khusus ini.
Tentukan Posisi Awal
Anda dapat memberikan argumen ketiga untuk menentukan posisi indeks awal untuk pencarian.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 4, "data" : "ABC XYZ ABC" }
Berikut ini contoh penerapan $indexOfBytes
dengan posisi awal:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "ABC", 1 ] }
}
}
]
)
Hasil:
{ "data" : "ABC XYZ ABC", "result" : 8 }
Dalam hal ini, instance kedua dari substring dikembalikan. Ini karena kami memulai pencarian di posisi 1
, dan turunan pertama dari substring dimulai pada posisi 0
(sebelum posisi awal pencarian).
Jika posisi awal adalah angka yang lebih besar dari panjang byte string atau lebih besar dari posisi akhir, $indexOfBytes
mengembalikan -1
.
Jika angkanya negatif, $indexOfBytes
mengembalikan kesalahan.
Tentukan Posisi Akhir
Anda juga dapat memberikan argumen keempat untuk menentukan posisi indeks akhir untuk pencarian.
Jika Anda memberikan argumen ini, Anda juga perlu memberikan posisi awal. Gagal melakukannya akan mengakibatkan argumen ini ditafsirkan sebagai titik awal.
Contoh:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "XYZ", 0, 5 ] }
}
}
]
)
Hasil:
{ "data" : "ABC XYZ ABC", "result" : -1 }
Hasilnya adalah -1
yang berarti substring tidak ditemukan. Itu karena kami memulai pencarian kami di posisi 0
dan berakhir di posisi 5
, oleh karena itu tidak menangkap substring.
Inilah yang terjadi jika kita menaikkan posisi indeks akhir:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "XYZ", 0, 7 ] }
}
}
]
)
Hasil:
{ "data" : "ABC XYZ ABC", "result" : 4 }
Kali ini nilainya dimasukkan dan posisi indeksnya dikembalikan.
Jika posisi akhir lebih kecil dari posisi awal, $indexOfBytes
mengembalikan -1
.
Jika angkanya negatif, $indexOfBytes
mengembalikan kesalahan.
Bidang Tidak Ada
Jika bidang tidak ada dalam dokumen, $indexOfBytes
mengembalikan null
.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 5 }
Inilah yang terjadi ketika kita menerapkan $indexOfBytes
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "XYZ" ] }
}
}
]
)
Hasil:
{ "result" : null }
Nilai Null
Jika argumen pertama adalah null
, $indexOfBytes
mengembalikan null
.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 6, "data" : null }
Inilah yang terjadi ketika kita menerapkan $indexOfBytes
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 6 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "XYZ" ] }
}
}
]
)
Hasil:
{ "data" : null, "result" : null }
Namun, ketika argumen kedua (yaitu substring) adalah null
, kesalahan dikembalikan:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", null ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$indexOfBytes requires a string as the second argument, found: null", "code" : 40092, "codeName" : "Location40092" } : 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
Jenis Data Salah
Jika argumen pertama adalah tipe data yang salah (yaitu tidak diselesaikan menjadi string), $indexOfBytes
mengembalikan kesalahan.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 7, "data" : 123 }
Inilah yang terjadi ketika kita menerapkan $indexOfBytes
ke dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 7 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $indexOfBytes: [ "$data", "XYZ" ] }
}
}
]
)
Hasil:
uncaught exception: Error: command failed: { "ok" : 0, "errmsg" : "$indexOfBytes requires a string as the first argument, found: double", "code" : 40091, "codeName" : "Location40091" } : 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
Seperti yang dinyatakan oleh pesan kesalahan, $indexOfBytes requires a string as the first argument
.