我遇到了一个奇怪的行为mongo和我想澄清一下...
我的要求很简单:我想得到一个大小的单一文件的集合。我发现两个可能的解决方案:
- bsonsize -一些应该返回字节大小的javascript方法。
- stats.collection.stats()--其中有一行“avgObjSize”,它生成了数据的“聚合”(平均)大小视图。它只是表示单个文档的平均大小。
当我创建只有一个文档的测试集合时,两个函数都返回不同的值。这怎么可能呢?
是否存在其他方法来获取mongo文档的大小?
在这里,我提供了一些代码,我执行测试:
1.我创建了一个新的数据库'test',并输入了一个简单的文档,其中只有一个属性:类型:“自动”
db.test.insert({type:"auto"})
- stats()函数调用输出:* 数据库测试统计数据()*:
{
"ns" : "test.test",
"count" : 1,
"size" : 40,
"avgObjSize" : 40,
"storageSize" : 4096,
"numExtents" : 1,
"nindexes" : 1,
"lastExtentSize" : 4096,
"paddingFactor" : 1,
"systemFlags" : 1,
"userFlags" : 0,
"totalIndexSize" : 8176,
"indexSizes" : {
"_id_" : 8176
},
"ok" : 1
}
- bsonsize函数调用输出:* 对象.bsonsize(数据库.测试.查找({测试:“自动”}))*
481
6条答案
按热度按时间3bygqnnd1#
在前面的
Object.bsonsize()
调用中,Mongodb返回的是光标的大小,而不是文档的大小。正确的方法是使用此命令:
使用
findOne()
,您可以定义特定文件的查询:这将返回特定文档的正确大小(以字节为单位)。
rsaldnfx2#
最大文档大小16 MiB(源)
如果您的版本大于等于4.4(
$bsonSize
source)如果您的版本低于4.4(
Object.bsonSize()
源代码)您可以使用此脚本获取实际大小:
注意:如果你的ID是64位整数,上面的代码会在打印时截断ID值!如果是这种情况,你可以使用:
这也有返回JSON的好处,所以像RoboMongo这样的GUI可以将它制成表格!
编辑:感谢@zAlbee建议完成。
ffx8fchx3#
由于Record Padding机制,文档在集合中占用的有效空间量将大于文档的大小。
这就是
db.test.stats()
和Object.bsonsize(..)
的输出之间存在差异的原因。要获得文档的精确大小(以字节为单位),请使用
Object.bsonsize()
函数。s6fujrry4#
使用mongodb4.4(即将推出),您可以使用
bsonSize
运算符来获取文档大小。plupiseo5#
bsonsize(db.test.findOne({type:“auto”}))它以字节为单位。
ars1skjm6#
方法
Object.bsonsize()
仅在旧版mongo
shell中可用。在新的mongosh
中,必须使用包bson或mongocompat snippets