由於在使用mongodb的過程中有碰到下面的問題,所以寫下來方便以後查閱。
下面是一段示例代碼:
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("abc");
DBCollection collection = db.getCollection("aaa");
DBObject query = new BasicDBObject();
query.put("xx", xx);
DBObject record = new BasicDBObject();
record.put("xxx", xxx);
collection.update(query, record, true, true);
在運行程序之前,mongodb中並不存在abc這個DB,也不存在aaa這個collection。
但是,按照正常情況,通過調用getDB獲取數據庫,如果是數據庫不存在的情況下,會自動創建該數據庫。同理,調用getColletion的時候,也會自動創建不存在的Colletion。
結果,運行程序之後發現,mongodb中確實創建了abc這個數據庫,但是還是不存在aaa這個Collection。
難道是getCollection調用的有問題,所以會創建失敗?
可是調試的時候,這裏並沒有出現異常啊,而且能夠正常的執行完update。
那難道是update的時候插入數據失敗了?由於沒有數據,導致了Colletion也不會去創建?
查看了一下update的說明,第三個參數(upsert if the database should create the element if it does not exist)說明如果query的記錄不存在的話,會直接新創建一條記錄,那按道理應該不會出現插入數據失敗的情況啊?
實在沒辦法,只好先把update試着用insert代替看能不能成功。結果發現改完之後的程序正常了!
所以,問題就是出在了update當中!回過頭再仔細的研究了一下update的說明,發現了一個小細節(An object will not be inserted if it does not exist in the collection and upsert=true and multi=true.)。
好了,那麼問題也就解決了。
以後需要注意的有兩點:
對於不存在的Colletion來說,使用getColletion的時候,只有在插入了數據之後,纔會去創建該Colletion。
upsert和multi兩個參數同時爲true時, 就算Colletion中不存在滿足query條件的記錄, update操作也不會去直接添加該記錄。