2013-06-06 15 views
36

È possibile trovare la dimensione del documento più grande in MongoDB?Trova la dimensione del documento più grande in MongoDB

db.collection.stats() indica la dimensione media, che non è realmente rappresentativa perché nel mio caso le dimensioni possono differire considerevolmente.

+0

Non so che cosa il driver che si sta utilizzando, ma si dovrebbe essere in grado di vedere la [dimensioni BSON] (https://github.com/mongodb/mongo-c-driver/blob /master/src/bson.h#L141) in qualche modo. Fatelo e una scansione della tabella per capire qual è il documento più grande. – vinipsmaker

+0

Non è facile, non esiste un operatore '$ documentSize' in una query MongoDB e' $ size' fa qualcosa di molto diverso. Il vero modo on-line nella maggior parte dei driver lato client, include il javascript è quello di utilizzare l'helper lato client. – Sammaye

risposta

72

È possibile utilizzare uno script di shell piccolo per ottenere questo valore.

Nota: In seguito farà un tavolo scansione completa

var max = 0; 
db.test.find().forEach(function(obj) { 
    var curr = Object.bsonsize(obj); 
    if(max < curr) { 
     max = curr; 
    } 
}) 
print(max); 
+0

Grazie! Ha funzionato perfettamente. – sashkello

+0

fantastico, possiamo ottenere anche l'ID oggetto del documento più grande? – timfeirg

+3

Mantenere una variabile extra che memorizza '_id', e questa variabile viene aggiornata quando il valore' max' cambia –

12

Nota: questo tenterà di memorizzare l'intero set di risultati in memoria (da .toArray). Attento su grandi set di dati. Non usare in produzione! La risposta di Abishek ha il vantaggio di lavorare su un cursore invece che su un array di memoria.

Se si desidera anche _id, provare questo. Dato una collezione chiamata "richieste":

// Creates a sorted list, then takes the max 
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop(); 

// { "size" : 3333, "_id" : "someUniqueIdHere" } 
+0

Dopo aver eseguito la risposta accettata, questo è lo script successivo che chiunque vorrebbe eseguire! – Mrchief

+0

Questa è la migliore risposta che ho visto! – mes

+1

Ho un errore in esecuzione: Errore: asserzione src \ mongo \ util \ net \ message_port.cpp: 195 src/mongo/shell/query.js: 113 –

1

Se si lavora con una collezione enorme, si carica tutto in una volta in memoria non funziona, dal momento che avrete bisogno di più RAM rispetto alla dimensione di tutta la collezione per farlo funzionare

Invece, è possibile elaborare l'intera collezione in lotti utilizzando il seguente pacchetto che ho creato: https://www.npmjs.com/package/mongodb-largest-documents

Tutto quello che dovete fare è fornire la stringa di connessione e la raccolta nome MongoDB. Lo script produrrà i primi X documenti più grandi quando termina l'attraversamento dell'intera collezione in lotti.

Preview

+0

Questo è esattamente ciò che il cursore integrato consente. Trasmette i dati anziché archiviare l'intera raccolta su ram. – dmo

+0

Ciao @dmo, potresti fornire un comando per ottenere questo tramite il cursore incorporato? –

+0

collection.find() restituisce un cursore. Il cursore è un flusso di dati. Quindi in JS puoi fare qualcosa del genere ... https://jsfiddle.net/ro6efkdz/ – dmo

Problemi correlati