От 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 :
example@sqldat.com/mongo/shell/utils.js:25:13
example@sqldat.com/mongo/shell/assert.js:18:14
example@sqldat.com/mongo/shell/assert.js:618:17
example@sqldat.com/mongo/shell/assert.js:708:16
example@sqldat.com/mongo/shell/db.js:266:5
example@sqldat.com/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() метод.