MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

$ strLenBytes so với $ strLenCP trong MongoDB:Sự khác biệt là gì?

MongoDB bao gồm $strLenBytes$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$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$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$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 } 

  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Lỗi PHP Mongo đọc từ ổ cắm

  2. Sao lưu và khôi phục MongoDB

  3. Tại sao nên học MongoDB - 10 lý do nên học MongoDB cho năm 2022

  4. Sao chép MongoDB qua môi trường đám mây lai

  5. Xuất json hợp lệ từ bộ sưu tập mongodb