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 :
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 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.