2013-06-06 78 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