Come ottenere la dimensione di un singolo documento in Mongodb?


87

Ho riscontrato uno strano comportamento di mongo e vorrei chiarirlo un po '... La
mia richiesta è così semplice: vorrei ottenere una dimensione del singolo documento nella raccolta. Ho trovato due possibili soluzioni:

  • Object.bsonsize - un metodo javascript che dovrebbe restituire una dimensione in byte
  • db.collection.stats () - dove è presente una riga "avgObjSize" che produce una visualizzazione di dimensioni "aggregate" (medie) sui dati. Rappresenta semplicemente la dimensione media di un singolo documento.

  • Quando creo una raccolta di test con un solo documento, entrambe le funzioni restituiscono valori diversi. Come è possibile?
    Esiste qualche altro metodo per ottenere le dimensioni di un documento mongo?

Qui fornisco del codice su cui eseguo i test:

  1. Ho creato un nuovo database "test" e ho inserito un documento semplice con un solo attributo: tipo: "auto"

    db.test.insert({type:"auto"})
    
  2. output dalla chiamata alla funzione stats (): db.test.stats () :

    { 
      "ns" : "test.test",
      "count" : 1,
      "size" : 40,
      "avgObjSize" : 40,
      "storageSize" : 4096,
      "numExtents" : 1,
      "nindexes" : 1,
      "lastExtentSize" : 4096,
      "paddingFactor" : 1,
      "systemFlags" : 1,
      "userFlags" : 0,
      "totalIndexSize" : 8176,
      "indexSizes" : {
            "_id_" : 8176
    },
    "ok" : 1
    

    }

  3. output dalla chiamata alla funzione bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))

    481
    

Risposte:


181

Nella precedente chiamata di Object.bsonsize(), Mongodb ha restituito la dimensione del cursore, piuttosto che il documento.

Il modo corretto è usare questo comando:

Object.bsonsize(db.test.findOne())

Con findOne(), puoi definire la tua query per un documento specifico:

Object.bsonsize(db.test.findOne({type:"auto"}))

Ciò restituirà la dimensione corretta (in byte) del particolare documento.


1
Come ottenere la dimensione di un elenco di documenti con query?
leon

Ma ovviamente questo codice recupererà il documento prima di calcolare la dimensione.
Sercan Ozdemir

Questo non restituisce una dimensione goood: (... Ma questo: stackoverflow.com/a/40993183/3933634
Liberateur

4
Come ottenere Object.bsonsize, qual è l'istruzione import o required?
PARAMANANDA PRADHAN

8
Per chiunque altro si sia perso, devi usare findOneinvece difind
Sam

36

Ho consigliato di utilizzare questo script per ottenere la dimensione reale.

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  print('_id: '+obj._id+' || Size: '+size+'B -> '+Math.round(size/(1024))+'KB -> '+Math.round(size/(1024*1024))+'MB (max 16MB)');
});

Nota: se i tuoi ID sono numeri interi a 64 bit, quanto sopra troncerà il valore ID durante la stampa! Se è così, puoi usare invece:

db.users.find().forEach(function(obj)
{
  var size = Object.bsonsize(obj);
  var stats =
  {
    '_id': obj._id, 
    'bytes': size, 
    'KB': Math.round(size/(1024)), 
    'MB': Math.round(size/(1024*1024))
  };
  print(stats);
});

Questo ha anche il vantaggio di restituire JSON, quindi una GUI come RoboMongo può tabularlo!

fonte: https://stackoverflow.com/a/16957505/3933634

modifica: grazie a @zAlbee per il completamento del tuo suggerimento.


Questo è esattamente quello che sto cercando ma non funziona forse correlato alla mia versione di mongo. quello attuale è 3.4?
Erce

Qualcun altro ottiene TypeError: Object.bsonsize is not a function?
Félix Paradis


L'etichetta corretta sarebbe piuttosto 'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))(o'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Wernfried Domscheit

31

La quantità effettiva di spazio che il documento occuperà nella raccolta sarà maggiore delle dimensioni del documento a causa del meccanismo di riempimento dei record .

Questo è il motivo per cui c'è una differenza tra le uscite di db.test.stats()e Object.bsonsize(..).

Per ottenere la dimensione esatta (in byte) del documento, attenersi alla Object.bsonsize()funzione.


Grazie per la tua risposta, in tal caso, ho un'altra domanda su questo problema: supponiamo di avere una raccolta in cui i documenti con un lungo elenco di identificatori vengono salvati sotto forma di elenco. (gli identificatori sono memorizzati originariamente nel file txt-csv con dimensione 300 kB; ogni identificatore è lungo 10 caratteri) Quando eseguo bsonsize su un documento di questo tipo, la dimensione è persino inferiore a 481. Restituisce 465. Potresti spiegarmi questa situazione, per favore?
user1949763

4
Quale dimensione viene utilizzata per applicare la limitazione della dimensione del documento mongDB? Object.bsonsize ()?
John Evans

La dimensione del documento MongoDB è un vincolo del Mongo, questo è trattato nel manuale sul loro sito web, 16 MB. Ho raggiunto questo limite diverse volte provando a importare i record.
htm11h

3

Con mongodb 4.4 (in arrivo), puoi usare l' bsonSizeoperatore per ottenere le dimensioni del documento.

db.test.aggregate([
  {
    "$project": {
      "name": 1,
      "object_size": { "$bsonSize": "$$ROOT" }
    }
  }
])

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.