2013-06-06 15 views
36

Ist es möglich, die größte Dokumentgröße in MongoDB zu finden?Größte Dokumentgröße in MongoDB finden

db.collection.stats() zeigt durchschnittliche Größe, die nicht wirklich repräsentativ ist, weil in meinem Fall Größen erheblich abweichen können.

+0

Ich weiß nicht, welche Treiber Sie verwenden, aber Sie sollten die [BSON size], um zu sehen sein können (https://github.com/mongodb/mongo-c-driver/blob /master/src/bson.h#L141) irgendwie. Machen Sie das und einen Table-Scan, um herauszufinden, was das größte Dokument ist. – vinipsmaker

+0

Nicht leicht, es gibt keinen '$ documentSize' Operator in einer MongoDB Abfrage und' $ size' macht etwas ganz anderes. Die onkly reale Weise in den meisten clientseitigen Treibern, schließt das Javascript ein ist, den clientseitigen Helfer zu benutzen. – Sammaye

Antwort

72

Sie können ein kleines Shell-Skript verwenden, um diesen Wert zu erhalten.

Hinweis: Im Anschluss wird eine vollständige Tabelle

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

Danke! Das hat perfekt funktioniert. – sashkello

+0

genial, können wir die Objekt-ID des größten Dokuments auch bekommen? – timfeirg

+3

Pflegen Sie eine zusätzliche Variable, die die '_id' speichert, und diese Variable wird aktualisiert, wenn sich der' max' Wert ändert –

12

Hinweis scannen tun: dies wird versuchen, das gesamte Ergebnis im Speicher gesetzt zu speichern (von .toArray). Vorsicht bei großen Datenmengen. Nicht in der Produktion verwenden! Abisheks Antwort hat den Vorteil, über einen Cursor anstatt über ein In-Memory-Array zu arbeiten.

Wenn Sie auch die _id möchten, versuchen Sie dies. Bei einer Sammlung namens „Anfragen“:

// 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

Nach dem Ausführen der akzeptierten Antwort, dies ist das nächste Skript, das jemand ausführen möchte! – Mrchief

+0

Dies ist eine beste Antwort, die ich gesehen habe! – mes

+1

Ich bekomme einen Fehler beim Ausführen dieser: Fehler: assertion src \ mongo \ util \ netz \ nachricht_port.cpp: 195 src/mongo/shell/query.js: 113 –

1

Wenn Sie mit einer riesigen Sammlung arbeiten, alles auf einmal in den Speicher geladen wird nicht funktionieren, da Sie mehr RAM benötigen als die Größe der gesamten Kollektion damit das funktioniert.

Stattdessen können Sie die gesamte Kollektion in Chargen mit dem folgenden Paket verarbeiten ich erstellt: https://www.npmjs.com/package/mongodb-largest-documents

Alles, was Sie tun müssen, ist die Verbindungszeichenfolge und Kollektionsnamen MongoDB bieten. Das Skript gibt die obersten X größten Dokumente aus, wenn es die gesamte Sammlung in Stapeln durchlaufen hat.

Preview

+0

Dies ist genau das, was der eingebaute Cursor zulässt. Es streamt die Daten und speichert nicht die gesamte Sammlung im RAM. – dmo

+0

Hi @ dmo, könnten Sie bitte einen Befehl bereitstellen, um dies über den eingebauten Cursor zu erreichen? –

+0

collection.find() gibt einen Cursor zurück. Der Cursor ist ein Datenstrom. Also in JS können Sie so etwas tun ... https://jsfiddle.net/ro6efkdz/ – dmo