2013-06-06 53 views
36

是否可以在MongoDB中查找最大文档大小?在MongoDB中查找最大文档大小

db.collection.stats()显示平均大小,这是不是真的代表,因为在我的情况下,大小可以有很大不同。

+0

我不知道你正在使用的驱动程序,但你应该能够看到[BSON大小(https://github.com/mongodb/mongo-c-driver/blob /master/src/bson.h#L141)。做到这一点,并进行表格扫描,找出最大的文件。 – vinipsmaker

+0

不容易,在MongoDB查询中没有'$ documentSize'运算符,'$ size'做的事情完全不同。在大多数客户端驱动程序中,真正的方式包括javascript一个是使用客户端帮助程序。 – Sammaye

回答

72

您可以使用小型shell脚本来获取此值。

注:以下将做全表扫描

var max = 0; 
db.test.find().forEach(function(obj) { 
    var curr = Object.bsonsize(obj); 
    if(max < curr) { 
     max = curr; 
    } 
}) 
print(max); 
+0

谢谢!这工作完美。 – sashkello

+0

真棒,我们能否获得最大文档的对象ID? – timfeirg

+3

保留一个额外的变量,它存储'_id',并且当'max'值发生变化时这个变量被更新 –

12

注:这将尝试存储整个结果集的内存(从.toArray)。小心处理大数据集。不要在生产中使用! Abishek的答案具有处理光标而不是跨越内存数组的优点。

如果你还想要_id,试试这个。给定一个名为集“请求”:

// Creates a sorted list, then takes the max 
db.requests.find().toArray().map(function(request) { return {size:Object.bsonsize(request), _id:request._id}; }).sort(function(a, b) { return a.size-b.size; }).pop(); 

// { "size" : 3333, "_id" : "someUniqueIdHere" } 
+0

运行公认的答案后,这是下一个脚本,有人想运行 – Mrchief

+0

这是我看到 – mes

+1

我得到运行此错误最佳答案:!错误:断言SRC \蒙戈\ UTIL \网络\ message_port.cpp:195的src /蒙戈/壳/ query.js:113 –

1

如果你有一个巨大的收集工作,同时加载这一切到内存中是行不通的,因为你需要更多的内存比整个集合的大小为了工作。

相反,你可以使用下面的包我创建的进程分批整个集合: https://www.npmjs.com/package/mongodb-largest-documents

所有你需要做的是提供MongoDB的连接字符串和集合名称。该脚本在完成批量遍历整个集合时将输出前X个最大的文档。

Preview

+0

这正是游标所允许的内容。它传输数据而不是将整个集合存储到RAM中。 – dmo

+0

嗨@dmo,你能否通过内置光标提供一个命令来实现这一点? –

+0

collection.find()返回一个游标。游标是一个数据流。所以在JS中,你可以做这样的事情... https://jsfiddle.net/ro6efkdz/ – dmo