java - 是什么解释了 MongoDb 对象的这种意外大小?

标签 java mongodb

我正在测试在 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/

相关文章:

node.js - Mongo 和 Node.js 查找和聚合

java - 使用 printwriter 时删除新行

java - 如何使用可调整大小的 JButton 制作紧凑的网格?

java - 使用 telnet 和服务器套接字连接到您自己的 PC。每次连接都被拒绝

java - 如何在scala中获取任何纪元的一天的开始?

node.js - 弄清楚 promise 遭到拒绝的正确方法是什么?

java - ArrayList 从文件中读取行并分配它们

json - 将数据导入 MongoDB Atlas

node.js - Mongoose 只得到一个字段的长度

javascript - 如何使用mongo shell加载多个js文件到数据库?