2016-08-11 5 views
2

Ich prüfe die Grenzen der Speicherung von Daten in Mongo.Was erklärt diese unerwartete Größe des Objekts von MongoDb?

Ich schrieb diese Testklasse, die 1.000.000 zufällige Doppeleinträge in ein Array einfügt und dieses Dokument eine Testsammlung speichert.

MongoCollection<Document> collection = mongo.getCollection("TestEmbedded"); 
Random random = new Random(); 
Document document = new Document(); 
document.append("easyFinder", "oneMillion"); 
List<Double> values = new ArrayList<>(1000000); 
for (int i = 0; i < 1000000; i++) { 
    double randomCost = 1000 * random.nextDouble(); 
    values.add(randomCost); 
} 
document.append("costs", values); 
collection.insertOne(document); 

dieses Objekt im Zeilenbefehl Fetching, sehe ich die Millionen Datensätze gespeichert sind:

db.TestEmbedded.find() 
{ "_id" : ObjectId("57ac6cffc75e5e2a6ffe24cc"), "easyFinder" : "oneMillion", "costs" : [ 102.58052971628796, 522.5775655563692, 537.8794277847542, ... ]} 

Ich versuche zu sehen, wie weit ich, bevor man die 16MB limit BSON size in dem Bemühen, bekommen zu zeigen, Warum speichern wir nicht so viele Daten in einem eingebetteten Dokument? Ich weiß, es gibt Alternativen wie "GridFS" und bessere Möglichkeiten, diese Daten zu modellieren (was wir wirklich tun).

Aber was verwirrt mich das Object.bsonsize() Betrieb dieses Dokument als Aufnahme zeigt weniger als ein Kilobyte Raum:

Object.bsonsize(db.TestEmbedded.find()) 
877 

Also, was soll das? Java zu kennen, verwendet 8 Bytes, um ein Double zu speichern, und Mongo müsste mindestens so viel Speicherplatz pro Datenpunkt verwenden. Warum liegt diese Bson-Größe nicht näher an 8 Megabyte?

Danke!

Antwort

1

db.TestEmbedded.find() gibt nicht das Objekt zurück, sondern einen Datenbankcursor, der klein ist.

Wenn Sie stattdessen Object.bsonsize(db.TestEmbedded.findOne()) verwenden, erhalten Sie die tatsächliche Größe des Dokuments bson.

+0

Yay, es funktioniert. Vielen Dank! – Cuga

Verwandte Themen