Từ MongoDB 4.4, bạn có thể sử dụng $bsonSize
toán tử đường ống tổng hợp để trả về kích thước của một tài liệu nhất định tính bằng byte.
$bsonSize
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 đối tượng hoặc null
.
Ví dụ
Giả sử chúng ta có một bộ sưu tập được gọi là bars
với tài liệu sau:
{ "_id" : 1, "name" : "Boardwalk Social", "location" : { "type" : "Point", "coordinates" : [ -16.919297718553366, 145.77675259719823 ] }, "categories" : [ "Bar", "Restaurant", "Hotel" ], "reviews" : [ { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, { "name" : "Lisa", "date" : "25 October, 2020", "rating" : 3, "comments" : "They just raised their prices :(" }, { "name" : "Kim", "date" : "21 October, 2020", "rating" : 4, "comments" : "Nice for Friday happy hour" } ] }
Chúng ta có thể thấy rằng location
trường chứa một tài liệu. Và reviews
trường chứa một mảng tài liệu.
Hãy sử dụng $bsonSize
toán tử để kiểm tra kích thước của location
lĩnh vực:
db.bars.aggregate([
{
$project: {
"locationSize": { $bsonSize: "$location" }
}
}
])
Kết quả:
{ "_id" : 1, "locationSize" : 61 }
Trong trường hợp này, kích thước của location
trường là 61 byte.
Đối tượng trong Mảng
Dưới đây là một ví dụ về cách lấy kích thước của tài liệu là một phần tử của mảng:
db.bars.aggregate([
{
$project: {
"review": { $arrayElemAt: [ "$reviews", 0 ] },
"reviewSize": { $bsonSize: { $arrayElemAt: [ "$reviews", 0 ] } }
}
}
]).pretty()
Kết quả:
{ "_id" : 1, "review" : { "name" : "Steve", "date" : "20 December, 2020", "rating" : 5, "comments" : "Great vibe." }, "reviewSize" : 91 }
Trong trường hợp này, chúng tôi sử dụng $arrayElemAt
để trả lại bài đánh giá thực tế và sau đó một lần nữa để trả lại kích thước của bài đánh giá đó.
Mảng MongoDB dựa trên số 0, vì vậy bài đánh giá là bài đánh giá đầu tiên.
Lấy kích thước của tài liệu cấp cao nhất
Chúng tôi có thể sử dụng $$ROOT
biến hệ thống để tham chiếu đến tài liệu cấp cao nhất - hoặc tài liệu gốc. Đây là tài liệu hiện đang được xử lý bằng đường ống.
Do đó, chúng tôi có thể vượt qua $$ROOT
biến thành $bsonSize
để có được kích thước của toàn bộ tài liệu hiện đang được xử lý.
Ví dụ:
db.bars.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Kết quả:
{ "_id" : 1, "rootSize" : 502 }
Trong trường hợp này, tài liệu có kích thước 502 byte.
Loại dữ liệu sai
Như đã đề cập, $bsonSize
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 đối tượng hoặc null
.
Dưới đây là một ví dụ về điều 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.bars.aggregate([
{
$project: {
"nameSize": { $bsonSize: "$name" }
}
}
])
Kết quả:
Error: command failed: { "ok" : 0, "errmsg" : "$bsonSize requires a document input, found: string", "code" : 31393, "codeName" : "Location31393" } : 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 chuỗi, nhưng đó không phải là một trong những loại BSON được hỗ trợ, vì vậy chúng tôi gặp lỗi.
Tuy nhiên, tất cả là không bị mất. Chúng ta có thể sử dụng $binarySize
để lấy kích thước của một chuỗi.
Nhận Tổng kích thước của Tất cả Tài liệu trong Bộ sưu tập
Giả sử chúng ta có một bộ sưu tập có tên là cats
với các tài liệu sau:
{ "_id" : 1, "name" : "Scratch", "born" : "March, 2020" } { "_id" : 2, "name" : "Meow", "weight" : 30 } { "_id" : 3, "name" : "Fluffy", "height" : 15 } { "_id" : 4, "name" : "Sox", "weight" : 40 } { "_id" : 5, "name" : null, "weight" : 20 } { "_id" : 6, "height" : 20, "born" : ISODate("2021-01-03T23:30:15.123Z") }
Như đã trình bày trước đó, chúng tôi có thể sử dụng $$ROOT
để trả lại tài liệu cấp cao nhất hiện đang được xử lý:
db.cats.aggregate([
{
$project: {
"rootSize": { $bsonSize: "$$ROOT" }
}
}
])
Kết quả:
{ "_id" : 1, "rootSize" : 58 } { "_id" : 2, "rootSize" : 49 } { "_id" : 3, "rootSize" : 51 } { "_id" : 4, "rootSize" : 48 } { "_id" : 5, "rootSize" : 40 } { "_id" : 6, "rootSize" : 48 }
Nhưng chúng tôi cũng có thể nhận được tổng số kích thước của tất cả các tài liệu trong bộ sưu tập.
Chúng ta có thể đạt được điều này như sau:
db.cats.aggregate([
{
$group: {
"_id": null,
"rootSize": { $sum: { $bsonSize: "$$ROOT" } }
}
}
])
Kết quả:
{ "_id" : null, "rootSize" : 294 }
Ở đây, chúng tôi đã nhóm các kết quả bằng cách sử dụng $group
nhà điều hành và cung cấp _id
trong tổng số null
. Chúng tôi có thể đã sử dụng bất kỳ giá trị không đổi nào khác.
Chúng tôi cũng đã sử dụng $sum
để tính toán kích thước kết hợp của các tài liệu khác nhau.
Chúng tôi có thể thấy rằng tổng kích thước của tất cả các tài liệu trong bộ sưu tập là 294, chúng tôi có thể xác nhận kích thước này bằng cách cộng các kết quả trong ví dụ trước.
Phương thức Object.bsonSize ()
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.