Definición
$binarySizeDevuelve el tamaño del contenido de una string o un valor de datos binario dado en bytes.
$binarySizetiene la siguiente sintaxis:{ $binarySize: <string or binData> } El argumento puede ser cualquier expresión válida, siempre que se resuelva en un valor de string o un valor de datos binarios. Para obtener más información sobre las expresiones, consulta Expresiones.
Comportamiento
El argumento para $binarySize debe resolverse en:
Una string,
Un valor de datos binarios, o
nulo.
Si el argumento es un string o un valor de datos binarios, la expresión devuelve el tamaño del argumento en bytes.
Si el argumento es null, la expresión devuelve null.
Si el argumento se resuelve en cualquier otro tipo de datos, $binarySize genera un error.
Cálculo del tamaño de la String
Si el argumento para $binarySize es una cadena, el operador cuenta el número de bytes codificados en UTF-8 en una cadena donde cada carácter puede usar entre uno y cuatro bytes.
Por ejemplo, los caracteres US-ASCII se codifican usando un byte. Los caracteres con marcas diacríticas y caracteres alfabéticos latinos adicionales (caracteres latinos fuera del alfabeto inglés) se codifican utilizando dos bytes. Los caracteres chinos, japoneses y coreanos generalmente requieren tres bytes, mientras que otros planos de Unicode (emojis, símbolos matemáticos, etc.) requieren cuatro bytes.
Considere los siguientes ejemplos:
Ejemplo | Resultados | notas | |
|---|---|---|---|
|
| Cada carácter se codifica utilizando un byte. | |
|
| Cada carácter se codifica utilizando un byte. | |
|
| Cada carácter se codifica utilizando un byte. | |
|
|
| |
|
| Las cadenas vacías retornan 0. | |
|
|
| |
|
| Cada carácter se codifica utilizando tres bytes. |
Ejemplo
En mongosh, cree una colección de ejemplo llamada images con los siguientes 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, "") } ])
La siguiente agregación projects:
El campo
name.El campo
imageSize, que utiliza$binarySizepara devolver el tamaño del campobinarydel documento en bytes.
db.images.aggregate([ { $project: { "name": "$name", "imageSize": { $binarySize: "$binary" } } } ])
La operación devuelve el siguiente 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 }
Encontrar los datos binarios más grandes
El siguiente pipeline devuelve la imagen con el tamaño de datos binarios más grande:
db.images.aggregate([ // First Stage { $project: { name: "$name", imageSize: { $binarySize: "$binary" } } }, // Second Stage { $sort: { "imageSize" : -1 } }, // Third Stage { $limit: 1 } ])
- Primera etapa
La primera etapa del pipeline
projects:El campo
name.El campo
imageSize, que utiliza$binarySizepara devolver el tamaño del campobinarydel documento en bytes.
Esta etapa produce los siguientes documentos para la siguiente etapa:
{ "_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
La segunda etapa
sortslos documentos porimageSizeen orden descendente.Esta etapa produce los siguientes documentos para la siguiente etapa:
{ "_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 } - Tercera etapa
La tercera etapa
limitslos documentos de salida para solo devolver el documento que aparece primero en el orden de clasificación:{ "_id" : 4, "name" : "concert.jpg", "imageSize" : 269 }