Da MongoDB 4.4, puoi usare $binarySize
operatore della pipeline di aggregazione per restituire la dimensione di una determinata stringa o il contenuto di un valore di dati binari in byte.
Accetta qualsiasi espressione valida purché si risolva in una stringa o in un valore di dati binari. L'argomento può anche essere null
, nel qual caso, $binarySize
restituisce null
.
Esempio
Supponiamo di avere una raccolta chiamata posts
con il seguente documento:
{ "_id" : 1, "title" : "Hello World!", "body" : "This is a test post for the purposes of testing", "tags" : [ "html", "css", "sql", "xml" ], "status" : null }
Possiamo usare il $binarySize
operatore per verificare la dimensione dei vari campi.
Esempio:
db.posts.aggregate([
{
$project: {
"titleSize": { $binarySize: "$title" },
"bodySize": { $binarySize: "$body" }
}
}
])
Risultato:
{ "_id" : 1, "titleSize" : 12, "bodySize" : 47 }
In questo caso, restituiamo la dimensione binaria del title
campo e il body
campo.
Valori Nulli
Se il valore del campo specificato è null
, il $binarySize
l'operatore restituirà null
.
Esempio:
db.posts.aggregate([
{
$project: {
"statusSize": { $binarySize: "$status" }
}
}
])
Risultato:
{ "_id" : 1, "statusSize" : null }
In questo caso, lo status
il campo nel nostro documento è null
, e così $binarySize
restituito null
.
Tipi di dati errati
Come accennato, $binarySize
accetta qualsiasi espressione valida purché si risolva in una stringa, un valore di dati binari o null
.
Ecco un esempio di cosa succede se fornisci un'espressione che si risolve in un tipo BSON diverso:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: "$tags" }
}
}
])
Risultato:
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
In questo caso, abbiamo provato a trovare la dimensione di un array, ma non è uno dei tipi BSON supportati, quindi viene visualizzato un errore.
Tuttavia, possiamo ancora ottenere le dimensioni dei singoli elementi dell'array (purché siano uno dei tipi supportati).
Esempio:
db.posts.aggregate([
{
$project: {
"tagsSize": { $binarySize: { $arrayElemAt: [ "$tags", 0 ] } }
}
}
])
Risultato:
{ "_id" : 1, "tagsSize" : 4 }
In questo esempio, otteniamo la dimensione del primo elemento dell'array (gli array sono a base zero, quindi 0
si riferisce al primo elemento).
Dimensione del documento
MongoDB ha anche il $bsonSize
operatore, che ti consente di ottenere le dimensioni di un documento.
Un altro modo per ottenere le dimensioni di un documento è utilizzare Object.bsonSize()
metodo.