我正在测试在 Mongo 中存储数据的限制。
我编写了这个测试类,它将 1,000,000 个随机 double 值插入到一个数组中,并将该文档存储在一个测试集合中。
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”这样的替代方案和更好的数据建模方法(这是我们真正在做的)。
但令我困惑的是 Object.bsonsize()
操作显示该文档占用的空间不到 1 KB:
Object.bsonsize(db.TestEmbedded.find())
877
那么是什么给了?知道 Java 使用 8 个字节来存储 double ,而 Mongo 必须为每个数据点至少使用那么多空间,为什么这个 bson 大小不接近 8 兆字节?
谢谢!
最佳答案
db.TestEmbedded.find()
返回的不是对象,而是一个较小的数据库游标。
如果您使用 Object.bsonsize(db.TestEmbedded.findOne())
,您将收到真实的文档 bson 大小。
关于java - 是什么解释了 MongoDb 对象的这种意外大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38896362/