Od MongoDB 4.4 můžete použít $binarySize
operátor agregačního kanálu, který vrátí velikost daného řetězce nebo obsahu binární datové hodnoty v bajtech.
Přijímá jakýkoli platný výraz, pokud se překládá na hodnotu řetězce nebo binárních dat. Argument může být také null
, v takovém případě $binarySize
vrátí null
.
Příklad
Předpokládejme, že máme kolekci nazvanou posts
s následujícím dokumentem:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Můžeme použít $binarySize
operátor pro kontrolu velikosti různých polí.
Příklad:
db.posts.aggregate([
{
$project: {
"titleSize": { $binarySize: "$title" },
"bodySize": { $binarySize: "$body" }
}
}
])
Výsledek:
{ "_id" : 1, "titleSize" : 12, "bodySize" : 47 }
V tomto případě vrátíme binární velikost title
pole a body
pole.
Nulové hodnoty
Pokud je hodnota zadaného pole null
, $binarySize
operátor vrátí null
.
Příklad:
db.posts.aggregate([
{
$project: {
"statusSize": { $binarySize: "$status" }
}
}
])
Výsledek:
{ "_id" : 1, "statusSize" : null }
V tomto případě status
pole v našem dokumentu je null
, a tak $binarySize
vrátil null
.
Chybné datové typy
Jak již bylo zmíněno, $binarySize
přijímá jakýkoli platný výraz, pokud se překládá buď na řetězec, binární datovou hodnotu nebo null
.
Zde je příklad toho, co se stane, když zadáte výraz, který se převede na jiný typ BSON:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: "$tags" }
}
}
])
Výsledek:
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
V tomto případě jsme se pokusili najít velikost pole, ale to není jeden z podporovaných typů BSON, takže se zobrazí chyba.
Stále však můžeme získat velikost jednotlivých prvků pole (pokud jsou jedním z podporovaných typů).
Příklad:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Výsledek:
{ "_id" : 1, "tagsSize" : 4 }
V tomto příkladu získáme velikost prvního prvku pole (pole jsou založeny na nule, takže 0
odkazuje na první prvek).
Velikost dokumentu
MongoDB má také $bsonSize
operátor, který vám umožní získat velikost dokumentu.
Dalším způsobem, jak získat velikost dokumentu, je použít Object.bsonSize()
metoda.