MongoDB, $strLenBytes
toán tử đường ống tổng hợp trả về số byte được mã hóa UTF-8 trong chuỗi được chỉ định.
Mỗi ký tự trong một chuỗi có thể chứa một số byte khác nhau, tùy thuộc vào ký tự được sử dụng. $strLenBytes
toán tử có thể tìm ra bao nhiêu byte mỗi ký tự chứa và trả về kết quả chính xác cho toàn bộ chuỗi.
Ví dụ
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":"Maimuang"} {"_id":2, "data":"M"} {"_id":3, "data":"a"} {" _id ":4," data ":" i "} {" _id ":5," data ":" m "} {" _id ":6," data ":" u "} {" _id ":7, "data":"a"} {"_id":8, "data":"n"} {"_id":9, "data":"g"}
Chúng tôi có thể áp dụng $strLenBytes
vào trường dữ liệu trong các tài liệu đó:
db.english.aggregate(
[
{
$project:
{
_id: 0,
data: 1,
result: { $strLenBytes: "$data" }
}
}
]
)
Kết quả:
{"data":"Maimuang", "result":8} {"data":"M", "result":1} {"data":"a", "result":1} {" data ":" i "," result ":1} {" data ":" m "," result ":1} {" data ":" u "," result ":1} {" data ":" a "," kết quả ":1} {" dữ liệu ":" n "," kết quả ":1} {" dữ liệu ":" g "," kết quả ":1}
Chúng ta có thể thấy rằng toàn bộ từ có 8 byte và mỗi ký tự là 1 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, mỗi ký tự là 3 byte.
Chúng tôi 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":"ง"}
Và đây là những gì sẽ xảy ra khi chúng tôi áp dụng $strLenBytes
đối với các tài liệu đó:
db.thai.aggregate ([{$ project:{_id:0, data:1, result:{$ strLenBytes:"$ data"}}}])
Kết quả:
{"data":"ไม้ เมือง", "result":24} {"data":"ไ", "result":3} {"data":"ม้", "result":6} { "data":"เ", "result":3} {"data":"มื", "result":6} {"data":"อ", "result":3} {"data":" ง "," kết quả ":3}
Hai trong số các ký tự này đã được sửa đổi bằng cách sử dụng dấu phụ, dẫn đến 6 byte được trả về.
Các nhân vật khác
Giả sử chúng ta có một bộ sưu tập được gọi là other
với các tài liệu sau:
{"_id":1, "data":"é"} {"_id":2, "data":"©"} {"_id":3, "data":"℘"}Và hãy áp dụng
$strLenBytes
đối với các tài liệu đó:db.other.aggregate( [ { $match: { _id: { $in: [ 1, 2, 3 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Kết quả:
{"data":"é", "result":2} {"data":"©", "result":2} {"data":"℘", "result":3}Hai ký tự đầu tiên là 2 byte và ký tự thứ ba là 3 byte. Số lượng byte phụ thuộc vào ký tự. Một số ký tự có thể sử dụng 4 byte.
Ký tự khoảng trắng sử dụng một byte. Do đó, hai ký tự khoảng trắng sử dụng 2 byte, v.v.
Giả sử chúng ta có các tài liệu sau:
{"_id":4, "data":""} {"_id":5, "data":""}Và chúng tôi áp dụng
$strLenBytes
đối với các tài liệu đó:db.other.aggregate( [ { $match: { _id: { $in: [ 4, 5 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Kết quả:
{"data":"", "result":1} {"data":"", "kết quả":2}Chuỗi trống
Chuỗi trống trả về
0
.Đây là tài liệu có chuỗi trống:
{"_id":6, "data":""}Và đây là những gì sẽ xảy ra khi chúng tôi áp dụng
$strLenBytes
vào tài liệu đó:db.other.aggregate( [ { $match: { _id: { $in: [ 6 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Kết quả:
{"data":"", "kết quả":0}Loại dữ liệu sai
Chuyển loại dữ liệu sai dẫn đến lỗi.
Giả sử chúng ta có tài liệu sau:
{"_id":7, "data":123}Trường dữ liệu
field
chứa một số.Hãy áp dụng
$strLenBytes
vào tài liệu đó:db.other.aggregate( [ { $match: { _id: { $in: [ 7 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Kết quả:
Lỗi:lệnh không thành công:{"ok":0, "errmsg":"$ strLenBytes yêu cầu đối số chuỗi, tìm thấy:double", "mã":34473, "codeName":"Location34473"}:tổng hợp không thành công:[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example @ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1Giá trị rỗng
Cung cấp
null
cũng dẫn đến lỗi.Giả sử chúng ta có tài liệu sau:
{"_id":8, "data":null}Trường dữ liệu
field
chứanull
.Hãy áp dụng
$strLenBytes
vào tài liệu đó:db.other.aggregate( [ { $match: { _id: { $in: [ 8 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Kết quả:
không có ngoại lệ:Lỗi:lệnh không thành công:{"ok":0, "errmsg":"$ strLenBytes yêu cầu đối số chuỗi, tìm thấy:null", "mã":34473, "codeName":"Location34473"}:tổng hợp không thành công:[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639 :[email protected]/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12 @ (shell):1:1Các trường bị thiếu
Tiếp tục với chủ đề tạo ra lỗi, việc chỉ định trường không tồn tại cũng tạo ra lỗi.
Tài liệu:
{"_id":9}Áp dụng
$strLenBytes
:db.other.aggregate( [ { $match: { _id: { $in: [ 9 ] } } }, { $project: { _id: 0, data: 1, result: { $strLenBytes: "$data" } } } ] )
Kết quả:
Lỗi:lệnh không thành công:{"ok":0, "errmsg":"$ strLenBytes yêu cầu đối số chuỗi, tìm thấy:thiếu", "mã":34473, "codeName":"Location34473"}:tổng hợp không thành công:[email protected]/mongo/shell/utils.js:25:[email protected]/mongo/shell/assert.js:18:[email protected]/mongo/shell/assert.js:639:17example @ sqldat.com/mongo/shell/assert.js:729:[email protected]/mongo/shell/db.js:266:[email protected]/mongo/shell/collection.js:1058:12@(shell ):1:1