Từ MongoDB 4.4, bạn có thể sử dụng $binarySize
toán tử đường ống tổng hợp để trả về kích thước của một chuỗi nhất định hoặc nội dung của giá trị dữ liệu nhị phân tính bằng byte.
Nó chấp nhận bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành giá trị dữ liệu chuỗi hoặc nhị phân. Đối số cũng có thể là null
, trong trường hợp đó, $binarySize
trả về null
.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là posts
với tài liệu sau:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Chúng ta có thể sử dụng $binarySize
toán tử để kiểm tra kích thước của các trường khác nhau.
Ví dụ:
db.posts.aggregate([
{
$project: {
"titleSize": { $binarySize: "$title" },
"bodySize": { $binarySize: "$body" }
}
}
])
Kết quả:
{ "_id" : 1, "titleSize" : 12, "bodySize" : 47 }
Trong trường hợp này, chúng tôi trả về kích thước nhị phân của title
trường và body
trường.
Giá trị rỗng
Nếu giá trị của trường được chỉ định là null
, $binarySize
toán tử sẽ trả về null
.
Ví dụ:
db.posts.aggregate([
{
$project: {
"statusSize": { $binarySize: "$status" }
}
}
])
Kết quả:
{ "_id" : 1, "statusSize" : null }
Trong trường hợp này, status
trường trong tài liệu của chúng tôi là null
và như vậy $binarySize
trả về null
.
Loại dữ liệu sai
Như đã đề cập, $binarySize
chấp nhận bất kỳ biểu thức hợp lệ nào miễn là nó phân giải thành một chuỗi, một giá trị dữ liệu nhị phân hoặc null
.
Dưới đây là một ví dụ về những gì sẽ xảy ra nếu bạn cung cấp một biểu thức phân giải thành một loại BSON khác:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: "$tags" }
}
}
])
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$binarySize requires a string or BinData argument, found: array", "code" : 51276, "codeName" : "Location51276" } : aggregate failed : [email protected]/mongo/shell/utils.js:25:13 [email protected]/mongo/shell/assert.js:18:14 [email protected]/mongo/shell/assert.js:618:17 [email protected]/mongo/shell/assert.js:708:16 [email protected]/mongo/shell/db.js:266:5 [email protected]/mongo/shell/collection.js:1046:12 @(shell):1:1
Trong trường hợp này, chúng tôi đã cố gắng tìm kích thước của một mảng, nhưng đó không phải là một trong các loại BSON được hỗ trợ, vì vậy chúng tôi gặp lỗi.
Tuy nhiên, chúng tôi vẫn có thể lấy kích thước của các phần tử mảng riêng lẻ (miễn là chúng thuộc một trong các loại được hỗ trợ).
Ví dụ:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Kết quả:
{ "_id" : 1, "tagsSize" : 4 }
Trong ví dụ này, chúng tôi nhận được kích thước của phần tử mảng đầu tiên (các mảng dựa trên 0, vì vậy 0
đề cập đến phần tử đầu tiên).
Kích thước tài liệu
MongoDB cũng có $bsonSize
toán tử, cho phép bạn lấy kích thước của tài liệu.
Một cách khác để lấy kích thước của tài liệu là sử dụng Object.bsonSize()
phương pháp.