MongoDB bao gồm $strLenBytes
và $strLenCP
các nhà khai thác trong khuôn khổ đường ống tổng hợp của nó. Các toán tử này thực hiện một điều tương tự nhưng hơi khác một chút. Trong một số trường hợp, cả hai sẽ trả về chính xác cùng một kết quả, trong khi trong các trường hợp khác, kết quả sẽ khác nhau.
Dưới đây là tổng quan nhanh về sự khác biệt giữa hai toán tử này.
Sự khác biệt
Dưới đây là định nghĩa của từng toán tử:
-
$strLenBytes
trả về số lượng byte được mã hóa UTF-8 trong chuỗi được chỉ định -
$strLenCP
trả về số điểm mã UTF-8 trong chuỗi được chỉ định.
Lưu ý sự khác biệt trong kiểu in đậm. Một trả về số byte , còn lại trả về số điểm mã .
Khi làm việc với chuỗi bằng tiếng Anh, số byte thường sẽ giống với số điểm mã. Mỗi điểm mã sẽ sử dụng một byte.
Nhưng khi làm việc với các ngôn ngữ khác sử dụng khối Unicode khác, bạn có thể thấy rằng số lượng byte tăng lên hai hoặc ba byte. Điều này cũng đúng khi làm việc với các điểm mã Unicode khác như biểu tượng, biểu tượng cảm xúc, v.v. Trong một số trường hợp, một ký tự đơn lẻ có thể sử dụng 4 byte.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là unicode
với các tài liệu sau:
{"_id":1, "data":"é"} {"_id":2, "data":"©"} {"_id":3, "data":"℘"}Và bây giờ chúng ta hãy áp dụng cả
$strLenBytes
và$strLenCP
vào trường dữ liệu:db.unicode.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Kết quả:
{"data":"é", "strLenCP":1, "strLenBytes":2} {"data":"©", "strLenCP":1, "strLenBytes":2} {"data":"℘", "strLenCP":1, "strLenBytes":3}Chúng ta có thể thấy rằng tất cả các ký tự chỉ sử dụng một điểm mã, nhưng tài liệu đầu tiên sử dụng hai byte và hai tài liệu khác mỗi tài liệu sử dụng ba byte.
Ký tự tiếng Anh
Giả sử chúng ta có một bộ sưu tập có tên là
english
với các tài liệu sau:{"_id":1, "data":"Fast dog"} {"_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"}Và bây giờ chúng ta hãy áp dụng cả
$strLenBytes
và$strLenCP
vào trường dữ liệu:db.english.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Kết quả:
{"data":"Fast dog", "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}Trong trường hợp này, tất cả các ký tự sử dụng một điểm mã và mỗi ký tự một byte.
Các ký tự tiếng Thái
Dưới đây là một ví dụ sử dụng các ký tự tiếng Thái để chứng minh rằng không phải tất cả các ngôn ngữ đều sử dụng một byte cho mỗi điểm mã.
Giả sử chúng ta có một bộ sưu tập có tên là
thai
với các tài liệu sau:{"_id":1, "data":"ไม้ เมือง"} {"_id":2, "data":"ไ"} {"_id":3, "data":"ม้"} { "_id":4, "data":"เ"} {"_id":5, "data":"มื"} {"_id":6, "data":"อ"} {"_id":7 , "data":"ง"}Đây là những gì sẽ xảy ra khi chúng tôi áp dụng cả
$strLenBytes
và$strLenCP
vào trường dữ liệu:db.thai.aggregate( [ { $project: { _id: 0, data: 1, strLenCP: { $strLenCP: "$data" }, strLenBytes: { $strLenBytes: "$data" } } } ] )
Kết quả:
{"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 }