MongoDB menyertakan $strLenBytes
dan $strLenCP
operator dalam kerangka pipa agregasinya. Operator-operator ini melakukan hal yang serupa tetapi sedikit berbeda. Dalam beberapa kasus, keduanya akan mengembalikan hasil yang sama persis, sementara dalam kasus lain hasilnya akan berbeda.
Berikut adalah ikhtisar singkat tentang perbedaan antara kedua operator ini.
Perbedaan
Berikut definisi dari masing-masing operator:
$strLenBytes
mengembalikan jumlah byte yang disandikan UTF-8 dalam string yang ditentukan$strLenCP
mengembalikan jumlah poin kode UTF-8 dalam string yang ditentukan.
Perhatikan perbedaan dalam huruf tebal. Satu mengembalikan angka byte , yang lain mengembalikan jumlah poin kode .
Saat bekerja dengan string dalam bahasa Inggris, jumlah byte biasanya akan sama dengan jumlah poin kode. Setiap titik kode akan menggunakan satu byte.
Tetapi ketika bekerja dengan bahasa lain yang menggunakan blok Unicode yang berbeda, Anda mungkin menemukan bahwa jumlah byte meningkat menjadi dua atau tiga byte. Hal ini juga berlaku saat bekerja dengan titik kode Unicode lainnya seperti simbol, emoji, dll. Dalam beberapa kasus, satu karakter mungkin menggunakan 4 byte.
Contoh
Misalkan kita memiliki koleksi yang disebut unicode
dengan dokumen sebagai berikut:
{ "_id" :1, "data" :"é" }{ "_id" :2, "data" :"©" }{ "_id" :3, "data" :"℘" }Dan sekarang mari kita terapkan keduanya
$strLenBytes
dan$strLenCP
ke bidang data:db.unicode.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Hasil:
{ "data" :"é", "strLenCP" :1, "strLenBytes" :2 }{ "data" :"©", "strLenCP" :1, "strLenBytes" :2 }{ "data" :"℘", "strLenCP" :1, "strLenBytes" :3 }Kita dapat melihat bahwa semua karakter hanya menggunakan satu titik kode, tetapi dokumen pertama menggunakan dua byte dan dua dokumen lainnya masing-masing menggunakan tiga byte.
Karakter Bahasa Inggris
Misalkan kita memiliki koleksi bernama
english
dengan dokumen sebagai berikut:{ "_id" :1, "data" :"Anjing cepat" }{ "_id" :2, "data" :"F" }{ "_id" :3, "data" :"a" }{ "_id" :4, "data" :"s" }{ "_id" :5, "data" :"t" }{ "_id" :6, "data" :" " }{ "_id" :7, "data" :"d" }{ "_id" :8, "data" :"o" }{ "_id" :9, "data" :"g" }Dan sekarang mari kita terapkan keduanya
$strLenBytes
dan$strLenCP
ke bidang data:db.english.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Hasil:
{ "data" :"Anjing cepat", "strLenCP" :8, "strLenBytes" :8 }{ "data" :"F", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"a", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"s", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"t", "strLenCP" :1, "strLenBytes" :1 }{ "data" :" ", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"d", "strLenCP" :1, "strLenBytes" :1 } { "data" :"o", "strLenCP" :1, "strLenBytes" :1 }{ "data" :"g", "strLenCP" :1, "strLenBytes" :1 }Dalam hal ini, semua karakter menggunakan satu titik kode dan masing-masing satu byte.
Karakter Thailand
Berikut adalah contoh yang menggunakan karakter Thailand untuk menunjukkan bahwa tidak semua bahasa menggunakan satu byte per titik kode.
Misalkan kita memiliki koleksi bernama
thai
dengan dokumen sebagai berikut:{ "_id" :1, "data" :"ไม้เมือง" }{ "_id" :2, "data" :"ไ" }{ "_id" :3, "data" :"ม้" }{ "_id" :4, "data" :"เ" }{ "_id" :5, "data" :"มื" }{ "_id" :6, "data" :"อ" }{ "_id" :7 , "data" :"ง" }Inilah yang terjadi ketika kita menerapkan keduanya
$strLenBytes
dan$strLenCP
ke bidang data:db.thai.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Hasil:
{ "data" :"ไม้เมือง", "strLenCP" :8, "strLenBytes" :24 }{ "data" :"ไ", "strLenCP" :1, "strLenBytes" :3 }{ "data" :"ม้", "strLenCP" :2, "strLenBytes" :6 }{ "data" :"เ", "strLenCP" :1, "strLenBytes" :3 }{ "data" :"มื", "strLenCP" :2, "strLenBytes" :6 }{ "data" :"อ", "strLenCP" :1, "strLenBytes" :3 }{ "data" :"ง", "strLenCP" :1, "strLenBytes" :3 }