我读到MongoDB文档的大小限制为4 MB。我还读到,当你插入一个文档时,MongoDB会添加一些填充,这样如果你在文档中添加一些内容,就不必移动整个文档并重新编制索引。
所以我想知道,它是否将文件以4MB的块存储在磁盘上?
由于
答案 0 :(得分:5)
从1.8开始,单个文档的大小限制为16MB(之前为4MB)。这是一个限制性的限制,因为当您从磁盘读取文档时,整个文档将被读入RAM。所以我认为目的是这个限制是尝试和保护内存/让你考虑你的架构设计。
然后将数据存储在磁盘上的多个数据文件中 - 我忘记了初始文件大小,但每次数据库增长时,都会创建一个新文件进行扩展,其中每个新文件的创建大于前一个文件,直到达到2GB的单个文件大小。从现在开始,如果数据库继续增长,则会为要插入的文档创建后续的2GB数据文件。
“chunks”在MongoDB的分片方面有意义。因此,文档以可配置大小的“块”存储,当需要进行平衡时,就会移动这些数据块(n个文档)。
答案 1 :(得分:2)
简单的答案是“不”。文档在Mongo文件中占用的实际空间是可变的,但它不是最大文档大小。数据库引擎会监视插入后文档的更改量,并根据该值计算填充因子。所以它一直在变化。
如果您感到好奇,可以使用 mongo shell中集合上的.stats()
函数查看数据的实际填充因子和存储空间。这是一个真实的例子(改变了一些名称以保护无辜的客户):
{14:42} ~/my_directory ➭ mongo
MongoDB shell version: 1.8.0
connecting to: test
> show collections
schedule_drilldown
schedule_report
system.indexes
> db.schedule_report.stats()
{
"ns" : "test.schedule_report",
"count" : 16749,
"size" : 60743292,
"avgObjSize" : 3626.681712341035,
"storageSize" : 86614016,
"numExtents" : 10,
"nindexes" : 3,
"lastExtentSize" : 23101696,
"paddingFactor" : 1.4599999999953628,
"flags" : 1,
"totalIndexSize" : 2899968,
"indexSizes" : {
"_id_" : 835584,
"WeekEnd_-1_Salon_1" : 925696,
"WeekEnd_-1_AreaCode_1" : 1138688
},
"ok" : 1
}
所以我的测试集合中有大约16,749条记录,平均大小约为3.6 KB(“avgObjSize”),总数据大小约为60 MB(“size” )。但是,事实证明,由于填充因素,它们实际上在磁盘上占用了大约86 MB(“ storageSize ”)。随着集合文档的更新,填充因子随着时间的推移而变化,但如果我现在插入一个新文档 ,它将分配文档所需空间的1.46倍(“ paddingFactor“)以避免在以后更改它时移动东西。对我而言,这是一个公平的规模/速度权衡。