Od MongoDB 4.4 możesz użyć $binarySize
operator potoku agregacji, który zwraca rozmiar danego ciągu lub zawartość wartości danych binarnych w bajtach.
Akceptuje każde prawidłowe wyrażenie, o ile jest ono wynikiem łańcucha lub wartości danych binarnych. Argumentem może być również null
, w takim przypadku $binarySize
zwraca null
.
Przykład
Załóżmy, że mamy kolekcję o nazwie posts
z następującym dokumentem:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Możemy użyć $binarySize
operatora, aby sprawdzić rozmiar różnych pól.
Przykład:
db.posts.aggregate([
{
$project: {
"titleSize": { $binarySize: "$title" },
"bodySize": { $binarySize: "$body" }
}
}
])
Wynik:
{ "_id" : 1, "titleSize" : 12, "bodySize" : 47 }
W takim przypadku zwracamy binarny rozmiar title
pole i body
pole.
Wartości puste
Jeśli wartość określonego pola to null
, $binarySize
operator zwróci null
.
Przykład:
db.posts.aggregate([
{
$project: {
"statusSize": { $binarySize: "$status" }
}
}
])
Wynik:
{ "_id" : 1, "statusSize" : null }
W tym przypadku status
pole w naszym dokumencie to null
, a więc $binarySize
zwrócono null
.
Niewłaściwe typy danych
Jak wspomniano, $binarySize
akceptuje dowolne poprawne wyrażenie, o ile jest tłumaczone na ciąg, wartość danych binarnych lub null
.
Oto przykład tego, co się stanie, jeśli podasz wyrażenie, które jest tłumaczone na inny typ BSON:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: "$tags" }
}
}
])
Wynik:
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
W tym przypadku próbowaliśmy znaleźć rozmiar tablicy, ale nie jest to jeden z obsługiwanych typów BSON, więc pojawia się błąd.
Jednak nadal możemy uzyskać rozmiar poszczególnych elementów tablicy (o ile są one jednym z obsługiwanych typów).
Przykład:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Wynik:
{ "_id" : 1, "tagsSize" : 4 }
W tym przykładzie otrzymujemy rozmiar pierwszego elementu tablicy (tablice są liczone od zera, więc 0
odnosi się do pierwszego elementu).
Rozmiar dokumentu
MongoDB ma również $bsonSize
operatora, który umożliwia określenie rozmiaru dokumentu.
Innym sposobem na uzyskanie rozmiaru dokumentu jest użycie Object.bsonSize()
metoda.