標籤:margin row 系統 檢查 欄位 vim 編輯器 next blog als
工作中碰到一個問題,需要把某個 collection 中的某些合格資料取出來,逐行處理其中某些欄位。mongodb 終端下支援直接寫 js 代碼、函數,也可以運行 js 檔案。
1 首先需要設定 mongo 終端的代碼編輯器,不設定的話只能輸入一行代碼檔案,無法處理大段 js 邏輯
進入 mongo 終端後,輸入
f={}
斷行符號後,繼續輸入:
edit f
未設定過相關係統變數的會收到如下提示:
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 代碼:設定好編輯器後,終端輸入:
tempFunc = {}
斷行符號後繼續輸入:
edit tempFunc
就會進入到剛剛設定的編輯器環境,我這裡是 vim 環境。注意:vim 中輸入的所有內容,會被替換成 “tempFunc = “ 中等號的右部分。所以如果不是只想編輯一行代碼的話,最好是在 vim 中編輯成一個函數,確保替換後會變成 tempFunc = function(){…} 的形式。我在 vim 中編輯的完整內容如下:
注意:
一定要仔細檢查文法,如果不小心打錯了字,調用時候是沒有效果的,也沒有辦法再次編輯,只能從頭再編輯一遍!!!
編輯好以後 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"]); }
在 mongodb 終端環境下寫多行 javascript 代碼、函數