是什么从MongoDb解释了这个意想不到的对象大小?

时间:2016-08-11 12:25:47

标签: java mongodb

我正在测试在Mongo中存储数据的限制。

我编写了这个测试类,它将1,000,000个随机双精度数组插入到一个数组中,并将该文档存储在一个测试集合中。

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);

在命令行中获取此对象,我看到存储了百万条记录:

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

我试图了解在点击16MB limit BSON size之前我能有多接近,以证明我们为什么不在嵌入式文档中存储这么多数据。我知道还有像GridFS&#39;以及更好的数据建模方法(这正是我们真正要做的)。

但令我困惑的是Object.bsonsize()操作显示该文档占用的空间不到一千字节:

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

那是什么给出的?知道Java使用8个字节来存储一个double,而Mongo每个数据点必须至少使用那么多空间,为什么这个bson大小不会接近8兆?

谢谢!

1 个答案:

答案 0 :(得分:1)

db.TestEmbedded.find()不返回对象,而是返回小尺寸的数据库游标。

如果您使用Object.bsonsize(db.TestEmbedded.findOne()),则会收到真实的文件bson尺寸。