工做中碰到一個問題,須要把某個 collection 中的某些符合條件的數據取出來,逐行處理其中某些字段。mongodb 終端下支持直接寫 js 代碼、函數,也能夠運行 js 文件。
1 首先須要設置 mongo 終端的代碼編輯器,不設置的話只能輸入一行代碼文件,沒法處理大段 js 邏輯
進入 mongo 終端後,輸入mongodb
f={}
回車後,繼續輸入:數據庫
edit f
未設置過相關係統變量的會收到以下提示:vim
please define EDITOR as a JavaScript string or as an environment variable
咱們能夠輸入如下語句,設置 EDITOR:編輯器
EDITOR="/usr/bin/vim"
這樣就臨時設置了 vim 編輯器做爲後續的 js 代碼編輯器。此爲臨時方法,關閉mongo 後再次使用就必須再次設置。能夠試着將 EDITOR="/usr/bin/vim" 加入到系統環境變量中,我暫時沒嘗試。。。函數
2 寫 js 代碼:設置好編輯器後,終端輸入:spa
tempFunc = {}
回車後繼續輸入:code
edit tempFunc
就會進入到剛剛設置的編輯器環境,我這裏是 vim 環境。注意:vim 中輸入的全部內容,會被替換成 「tempFunc = 「 中等號的右部分。因此若是不是隻想編輯一行代碼的話,最好是在 vim 中編輯成一個函數,確保替換後會變成 tempFunc = function(){…} 的形式。我在 vim 中編輯的完整內容以下:blog
注意:ip
必定要仔細檢查語法,若是不當心打錯了字,調用時候是沒有效果的,也沒有辦法再次編輯,只能從頭再編輯一遍!!!string
編輯好之後 wq 退出 vim,到此咱們就完整定義了一個 tempFunc 函數。
在終端中輸入函數調用:
tempFunc()
mongo 會把 entities 表中全部 grade<2 的數據取出來,而後對 grade +1,再寫回數據庫。
注:
1:這裏 update語句 寫的有一個問題:原來的 grade 若是是 int32 類型,寫入後會變成 double 類型。包括使用 inc、dec 之類的操做,都會把 int32 類型的數據覆寫成 double 類型。用 NumberInt 函數就能夠解決
能夠把 update 語句改爲這樣:
db.entities.update({_id:rowData["_id"]}, {$set:{grade:NumberInt(newGrade)}}, {multi:false});
2:儘可能定義成一個函數體,方便外界總體調用。若是不想定義成一個函數,能夠一開始的時候直接 輸入 edit{}, 而後再 vim 中刪掉默認保留的{},就能夠寫一行行的 js 代碼了,最後退出 vim 的時候會壓縮成一行代碼,相似於這種,而後按回車就直接執行了:
var cursor = db.entities.find(); while(cursor.hasNext()){ var row = cursor.next(); print(row["grade"]); }