От MongoDB 4.4 можете да използвате $binarySize
Оператор на конвейер за агрегиране, за да върне размера на съдържанието на даден низ или стойност на двоични данни в байтове.
Той приема всеки валиден израз, стига да се разрешава до стойност на низ или двоични данни. Аргументът може също да бъде null
, в който случай $binarySize
връща null
.
Пример
Да предположим, че имаме колекция, наречена posts
със следния документ:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Можем да използваме $binarySize
оператор за проверка на размера на различни полета.
Пример:
db.posts.aggregate([
{
$project: {
"titleSize": { $binarySize: "$title" },
"bodySize": { $binarySize: "$body" }
}
}
])
Резултат:
{ "_id" : 1, "titleSize" : 12, "bodySize" : 47 }
В този случай връщаме двоичния размер на title
полето и body
поле.
Нулеви стойности
Ако стойността на посоченото поле е null
, $binarySize
операторът ще върне null
.
Пример:
db.posts.aggregate([
{
$project: {
"statusSize": { $binarySize: "$status" }
}
}
])
Резултат:
{ "_id" : 1, "statusSize" : null }
В този случай status
полето в нашия документ е null
, и така $binarySize
върна null
.
Грешни типове данни
Както споменахме, $binarySize
приема всеки валиден израз, стига да се разрешава до низ, стойност на двоични данни или null
.
Ето пример за това какво се случва, ако предоставите израз, който се разрешава до различен тип BSON:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: "$tags" }
}
}
])
Резултат:
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
В този случай се опитахме да намерим размера на масив, но това не е един от поддържаните типове BSON, така че получаваме грешка.
Все пак можем да получим размера на отделните елементи на масива (стига да са един от поддържаните типове).
Пример:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Резултат:
{ "_id" : 1, "tagsSize" : 4 }
В този пример получаваме размера на първия елемент на масива (масивите са базирани на нула, така че 0
се отнася до първия елемент).
Размер на документа
MongoDB също има $bsonSize
оператор, който ви позволява да получите размера на документ.
Друг начин да получите размера на документа е да използвате Object.bsonSize()
метод.