Ich bin auf ein seltsames Verhalten von Mongo gestoßen und möchte es ein wenig klären ...
Meine Anfrage ist so einfach: Ich möchte eine Größe eines einzelnen Dokuments in der Sammlung haben. Ich habe zwei mögliche Lösungen gefunden:
- Object.bsonsize - eine Javascript-Methode, die eine Größe in Bytes zurückgeben sollte
- db.collection.stats () - Hier gibt es eine Zeile 'avgObjSize', die eine "aggregierte" (durchschnittliche) Größenansicht der Daten erzeugt. Es repräsentiert einfach die durchschnittliche Größe eines einzelnen Dokuments.
Wenn ich eine Testsammlung mit nur einem Dokument erstelle, geben beide Funktionen unterschiedliche Werte zurück. Wie ist es möglich?
Gibt es eine andere Methode, um die Größe eines Mongo-Dokuments zu ermitteln?
Hier stelle ich einen Code bereit, an dem ich Tests durchführe:
Ich habe eine neue Datenbank 'test' erstellt und ein einfaches Dokument mit nur einem Attribut eingegeben: type: "auto"
db.test.insert({type:"auto"})
Ausgabe des Funktionsaufrufs 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
}}
Ausgabe des Funktionsaufrufs bsonsize: Object.bsonsize (db.test.find ({test: "auto"}))
481
quelle
findOne
anstelle vonfind
Der effektive Speicherplatz, den das Dokument in der Sammlung einnimmt, ist aufgrund des Mechanismus zum Auffüllen von Datensätzen größer als die Größe Ihres Dokuments .
Aus diesem Grund gibt es einen Unterschied zwischen den Ausgängen von
db.test.stats()
undObject.bsonsize(..)
.Um die genaue Größe (in Byte) des Dokuments zu erhalten, halten Sie sich an die
Object.bsonsize()
Funktion.quelle
Ich habe empfohlen, dieses Skript zu verwenden, um die tatsächliche Größe zu erhalten.
Hinweis: Wenn Ihre IDs 64-Bit-Ganzzahlen sind, wird der ID-Wert beim Drucken durch die obigen Angaben abgeschnitten! Wenn dies der Fall ist, können Sie stattdessen Folgendes verwenden:
Dies hat auch den Vorteil, dass JSON zurückgegeben wird, sodass eine GUI wie RoboMongo es tabellieren kann!
Quelle: https://stackoverflow.com/a/16957505/3933634
edit: danke an @zAlbee für deinen Vorschlag zur Fertigstellung.
quelle
TypeError: Object.bsonsize is not a function
?'KiB': Math.round(size/(1024)), 'MiB': Math.round(size/(1024*1024))
(oder'kB': Math.round(size/(1000)), 'MB': Math.round(size/(1000*1000))
Object.bsonsize (db.test.findOne ({type: "auto"})) Gibt in Bytes an.
quelle
Mit mongodb 4.4 (in Vorbereitung ) können Sie den
bsonSize
Operator verwenden, um die Dokumentgröße abzurufen .quelle