最近有乙個需求,需要從乙個mongodb操作日誌表中取出所有對mongo集合的處理,然後執行操作。簡單來說就是找到之前所有使用者的操作,然後在一張空白集合中再次演繹一遍。因為這些操作基本都不相同即每次修改都是不一樣的,所以從效率上考慮採用批量更新的方法。
參考文章:原文對批量更新的講述比較細。由於講述的是mongo2.0.0之前版本,而我使用的是2.1.5,故而實施過程中會出現了一些版本相容問題:
mongotemplate.getcollection()返回的型別由之前的dbcollection變成了mongocollection
下面給出修改後的核心**(如有興趣可參考尹吉歡文章 )。
public class batchupdateoptions
public class mongobasedao
private static int dobatchupdate(mongotemplate mongotemplate, string collname, listoptions, boolean ordered)
command.put("updates", updatelist);
command.put("ordered", ordered);
document document = mongotemplate.getdb().runcommand((bson) command);
system.out.println("doc:"+document);
system.out.println("doc--n:"+document.get("n"));
system.out.println("doc--nmodified:"+document.get("nmodified"));
// n為符合query查詢的記錄總數 因為是根據id進行的查詢, 原則上只要符合查詢的記錄數等於要更新的數量就代表成功
object n = document.get("n");
system.out.println("doc--n--class:"+n.getclass());
if(n.getclass()==integer.class)
return integer.parseint(string.valueof(n));
}}
注意: 這裡對原作者的**進行了修改【聯絡到了原作者,原作者給出的方法】:
將dbobjec型別的command轉換為了bson。
執行命令的函式改為了mongotemplate.getdb().runcommand()
mongo官方手冊給出的更新命令的說明:
listlist = new arraylist();
// 注意upsert置為false, 更新過程不做插入
for (map map : aus)
query query = query.query(criteria.where(primarykey).is(map.get("id")));
batchupdateoptions options = new batchupdateoptions(query, update, false, true);
list.add(options);
}int n = mongobasedao.batchupdate(mongotemplate, collectionname, list, true);
boolean res = (n == aus.size());
aus為封裝的所有對mongo進行更新的集合。 Windows上通過Ruby訪問MongoDB
1 安裝ruby。略過。2 更新rubygem gem update system 3 安裝mongodb的drivers gem install mongo 想要在windows上執行該驅動,需要先安裝ruby devkit以便編譯c擴充套件。gem install bsongem install...
Mac下使用HomeBrew安裝MongoDb
1.homebrew的安裝 mac下 首先開啟終端,輸入 ruby e curl insecure fssl 這句話執行完會叫你輸入密碼,輸入你的賬戶密碼即可。2.正常安裝完成會有提示instalation successful。輸入 brew 會彈出你的brew資訊,就算安裝完成了。下面是mong...
Mac 下使用homebrew安裝MongoDB
1 安裝homebrew 終端輸入 usr bin ruby e curl fssl 安裝完成homebrew之後可以通過brew version來檢視當前homebrew版本 2 安裝mongodb 終端輸入 brew install mongodb建立資料儲存目錄 終端輸入 sudo mkdir...