Di MongoDB, $substrCP
operator pipeline agregasi mengembalikan substring string, berdasarkan indeks titik kode UTF-8 yang ditentukan.
Sintaks
Sintaksnya seperti ini:
{ $substrCP: [ <string expression>, <code point index>, <code point count> ] }
Dimana:
<string expression>
adalah string. Itu bisa berupa ekspresi apa pun yang valid selama itu diselesaikan menjadi string.<code point index>
adalah di mana untuk memulai substring. Itu bisa berupa ekspresi apa pun yang valid selama itu diselesaikan ke bilangan bulat non-negatif.<code point count>
adalah berapa banyak poin kode 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 $substrCP
seperti ini:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 3 ] }
}
}
]
)
Hasil:
{ "data" : "Red Firetruck", "result" : "Red" }
Indeks dimulai dari nol, dan substring kita dimulai dari awal string, dan berlanjut selama tiga poin kode.
Dalam hal ini, kami menggunakan karakter bahasa Inggris dan setiap karakter memiliki satu titik kode. Hal ini memudahkan kita untuk menghitung berapa banyak kode poin yang akan digunakan.
Mari kita jalankan contoh lain:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result_1: { $substrCP: [ "$data", 4, 4 ] },
result_2: { $substrCP: [ "$data", 8, 5 ] },
result_3: { $substrCP: [ "$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 poin kode daripada yang tersedia, tetapi itu hanya mengembalikan semua karakter ke akhir string.
Tanda Diakritik
Beberapa karakter memiliki tanda diakritik yang ditambahkan, menghasilkan beberapa poin kode.
Misalkan kita memiliki koleksi bernama thai
yang berisi dokumen-dokumen berikut:
{ "_id" : 1, "data" : "ไม้เมือง" } { "_id" : 2, "data" : "ไ" } { "_id" : 3, "data" : "ม้" } { "_id" : 4, "data" : "เ" } { "_id" : 5, "data" : "มื" } { "_id" : 6, "data" : "อ" } { "_id" : 7, "data" : "ง" }
Dokumen-dokumen ini berisi karakter Thailand. Kita dapat melihat bahwa dua karakter ini menyertakan diakritik (mesin terbang kecil di atas mesin terbang awal).
Dokumen 2 sampai 7 hanya mencantumkan setiap karakter yang ada di dokumen 1.
Sebelum kita mengambil substring, mari kita cari tahu berapa banyak titik kode yang dimiliki masing-masing karakter ini dengan menggunakan $strLenCP
operator:
db.thai.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenCP: "$data" }
}
}
]
)
Hasil:
{ "data" : "ไม้เมือง", "result" : 8 } { "data" : "ไ", "result" : 1 } { "data" : "ม้", "result" : 2 } { "data" : "เ", "result" : 1 } { "data" : "มื", "result" : 2 } { "data" : "อ", "result" : 1 } { "data" : "ง", "result" : 1 }
Kita dapat melihat bahwa dua karakter dengan diakritik memiliki dua titik kode, dan yang lainnya memiliki satu titik kode.
Mari kita terapkan $substrCP
ke dokumen pertama:
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Hasil:
{ "data" : "ไม้เมือง", "result" : "ม้" }
Berdasarkan titik awal kami dari 1
dan jumlah poin kode kami 2
, kita mendapatkan karakter kedua dan diakritik yang terkait.
Pisahkan Glyphs
Pada contoh sebelumnya, argumen ketiga kita adalah 2 sehingga mengembalikan karakter dan diakritik secara bersamaan. Inilah yang terjadi ketika kami memberikan argumen ketiga dari 1.
db.thai.aggregate(
[
{ $match: { _id: { $in: [ 1 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 1 ] }
}
}
]
)
Hasil:
{ "data" : "ไม้เมือง", "result" : "ม" }
Karakter pertama dikembalikan tanpa tanda diakritik.
Jenis Data Lainnya
$substrCP
operator hanya bekerja pada string. Namun, jika Anda memiliki tipe data lain, itu akan tetap berfungsi, selama dapat diselesaikan menjadi string.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 2, "data" : 123456 }
data
kolom berisi angka.
Inilah yang terjadi ketika kita menerapkan $substrCP
ke bidang itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 2 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Hasil:
{ "data" : 123456, "result" : "23" }
Itu berhasil melakukan pekerjaan dengan baik (meskipun perlu diingat bahwa hasilnya adalah string – bukan angka).
Kami memiliki dokumen lain dengan objek Date:
{ "_id" : 3, "data" : ISODate("2021-01-03T23:30:15.100Z") }
Sekarang mari kita terapkan $substrCP
ke dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 3 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 0, 4 ] }
}
}
]
)
Hasil:
{ "data" : ISODate("2021-01-03T23:30:15.100Z"), "result" : "2021" }
Jadi itu bekerja dengan baik dalam skenario ini juga.
Nilai Null
Jika string null
, hasilnya adalah string kosong.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 4, "data" : null }
Inilah yang terjadi ketika kita menerapkan $substrCP
ke dokumen itu:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 4 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Hasil:
{ "data" : null, "result" : "" }
Bidang Tidak Ada
Mencoba mendapatkan substring dari bidang yang tidak ada menghasilkan string kosong.
Misalkan kita memiliki dokumen berikut:
{ "_id" : 5 }
Terapkan $substrCP
:
db.test.aggregate(
[
{ $match: { _id: { $in: [ 5 ] } } },
{
$project:
{
_id: 0,
data: 1,
result: { $substrCP: [ "$data", 1, 2 ] }
}
}
]
)
Hasil:
{ "result" : "" }