查詢20M-Record MongoDB集合
Storify 保存了大量關於社交元素的元數據:推文、Facebook 狀態更新、博客文章、新聞文章等。MongoDB 非常適合存儲此類非結構化數據,但上週我不得不修復 2000 萬條記錄元素集合中的一些不一致問題.
腳本很簡單:查找元素,查看是否沒有依賴關係,刪除孤立元素,但它仍然超時或只是變得無響應。經過幾個小時的不同修改,我想出了可行的解決方案。
以下是在 Node.js + MongoDB 堆棧上處理大集合時的一些建議:
結交貝殼
交互式外殼,或 mongo ,是一個很好的起點。要啟動它,只需輸入 mongo 在您的終端窗口中:
$ mongo
假設您在 MongoDB 安裝期間設置了正確的路徑,該命令將啟動 shell 並顯示尖括號。
>
使用 JS 文件
在 Mongo shell 運行中執行 JavaScript 文件:
$ mongo fix.js --shell
查詢看起來一樣:
db.elements.find({...}).limit(10).forEach(printjson);
輸出結果使用:
print();
或
printjson();
連接數據庫:
db = connect("<host>:<port>/<dbname>")
分解
將您的查詢分成幾個具有較小查詢的腳本。您可以將每個腳本輸出到一個文件(如 JSON 或 CSV),然後查看輸出,看看您的腳本是否正在執行它實際應該執行的操作。
要執行 JavaScript 文件 (fix.js) 並將結果輸出到另一個文件 (fix.txt) 而不是屏幕,請使用:
$ mongo fix.js > fix.txt --shell
或
$ mongo --quiet fix.js > fix.txt --shell
檢查計數()
只需運行 count() 查看集合中的元素數量:
db.collection.count();
或光標:
[旁注]
閱讀博客文章很好,但觀看視頻課程更好,因為它們更具吸引力。
許多開發人員抱怨 Node.js 上缺乏負擔得起的高質量視頻材料。觀看 YouTube 視頻會讓人分心,花 500 美元購買 Node 視頻課程很瘋狂!
去看看 Node University,它有關於 Node 的免費視頻課程:node.university。
[旁注結束]
db.collection.find({…}).count();
使用limit()
您可以申請 limit() 無需修改腳本中的任何其他內容即可對您的光標執行函數來測試輸出,而無需花費太多時間等待整個結果。
例如:
db.find({…}).limit(10).forEach(function() {…});
或
db.find({…}).limit(1).forEach(function() {…});
比使用更好:
db.findOne({…})
因為 findOne() find() 時返回單個文檔 並且 limit() 仍然返回一個游標。
命中索引
提示() index 將允許您手動使用特定索引:
db.elemetns.find({…}).hint({active:1, status:1, slug:1});
使用 ensureIndex() 確保您有實際的索引 :
db.collection.ensureIndex({…})
縮小範圍
使用附加條件,例如 $ne , $哪裡 , $in ,例如:
db.elements.find({ $and:[{type:'link'}
,{"source.href":{$exists:true}}
,{'date.created':{$gt: new Date("November 30 2012")}}
,{$where: function () {
if (this.meta&&this.data&&this.data&&this.data.link) {
return this.meta.title!=this.data.link.title;
} else {
return false;
}}}
, {'date.created': {$lt: new Date("December 2 2012")}}]}).forEach(function(e, index, array){
print(e._id.str);
});