$binarySize (agregação)
Nesta página
Definição
$binarySize
Retorna o tamanho de uma determinada string ou o conteúdo do valor dos dados binários em bytes.
$binarySize
tem a seguinte sintaxe:{ $binarySize: <string or binData> } O argumento pode ser qualquerexpressão válida, desde que resolva para um valor de string ou de dados binários. Para obter mais informações sobre expressões, consulte Operadores de expressão.
Comportamento
O argumento para $binarySize
deve resultar em:
Uma string,
Um valor de dados binários, ou
nulo.
Se o argumento for uma string ou valor de dados binário, a expressão retornará o tamanho do argumento em bytes.
Se o argumento for null
, a expressão retornará null
.
Se o argumento for resolvido para qualquer outro tipo de dados, ocorrerão $binarySize
erros.
Cálculo do tamanho da string
Se o argumento para $binarySize
for uma string, o operador conta o número de bytes codificados em UTF-8 em uma string onde cada caractere pode usar entre um e quatro bytes.
Por exemplo, os caracteres US-ASCII são codificados usando um byte. Caracteres com diacríticos e caracteres alfabéticos latinos adicionais (caracteres latinos fora do alfabeto inglês) são codificados usando dois bytes. Caracteres chineses, tailandeses e coreanos normalmente exigem três bytes, e outros planos de unicode (emoji, símbolos matemáticos etc.) exigem quatro bytes.
Considere os seguintes exemplos:
Exemplo | Resultados | Notas | |
---|---|---|---|
| 5 | Cada caractere é codificado usando um byte. | |
| 12 | Cada caractere é codificado usando um byte. | |
| 9 | Cada caractere é codificado usando um byte. | |
| 11 | é é codificado usando dois bytes. | |
| 0 | Strings vazias retornam 0. | |
| 7 | € é codificado usando três bytes. λ está codificado usando dois bytes. | |
| 6 | Cada caractere é codificado usando três bytes. |
Exemplo
No mongosh
, crie uma coleção de amostra denominada images
com os seguintes documentos:
db.images.insertMany([ { _id: 1, name: "cat.jpg", binary: new BinData(0, "OEJTfmD8twzaj/LPKLIVkA==")}, { _id: 2, name: "big_ben.jpg", binary: new BinData(0, "aGVsZmRqYWZqYmxhaGJsYXJnYWZkYXJlcTU1NDE1Z2FmZCBmZGFmZGE=")}, { _id: 3, name: "tea_set.jpg", binary: new BinData(0, "MyIRAFVEd2aImaq7zN3u/w==")}, { _id: 4, name: "concert.jpg", binary: new BinData(0, "TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4=")}, { _id: 5, name: "empty.jpg", binary: new BinData(0, "") } ])
A seguinte aggregation projects
:
O campo
name
O campo
imageSize
, que utiliza$binarySize
para retornar o tamanho do campobinary
do documento em bytes.
db.images.aggregate([ { $project: { "name": "$name", "imageSize": { $binarySize: "$binary" } } } ])
A operação retorna o seguinte resultado:
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 } { "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 } { "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 } { "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 } { "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 }
Encontre os maiores dados binários
O pipeline a seguir retorna a imagem com o maior tamanho de dados binários:
db.images.aggregate([ // First Stage { $project: { name: "$name", imageSize: { $binarySize: "$binary" } } }, // Second Stage { $sort: { "imageSize" : -1 } }, // Third Stage { $limit: 1 } ])
- Primeira etapa
O primeiro estágio do pipeline
projects
:O campo
name
O campo
imageSize
, que utiliza$binarySize
para retornar o tamanho do campobinary
do documento em bytes.
Este estágio produz os seguintes documentos para o próximo estágio:
{ "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 } { "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 } { "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 } { "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 } { "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 } - Segunda etapa
O segundo estágio
sorts
os documentos porimageSize
em ordem decrescente.Este estágio produz os seguintes documentos para o próximo estágio:
{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 } { "_id" : 2, "name" : "big_ben.jpg", "imageSize" : 41 } { "_id" : 1, "name" : "cat.jpg", "imageSize" : 16 } { "_id" : 3, "name" : "teaset.jpg", "imageSize" : 16 } { "_id" : 5, "name" : "empty.jpg", "imageSize" : 0 } - Terceiro estágio
O terceiro estágio
limits
os documentos de saída para retornar apenas o documento que aparece primeiro na ordem de classificação:{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }