我正在测试在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兆?
谢谢!
答案 0 :(得分:1)
db.TestEmbedded.find()
不返回对象,而是返回小尺寸的数据库游标。
如果您使用Object.bsonsize(db.TestEmbedded.findOne())
,则会收到真实的文件bson尺寸。