一.mongo-java-driverhtml
項目中使用的是java原生mongo操做api,我的以爲,不是那麼的方便,資料好像也比較少,只有官方文檔可供使用
java
基礎用法再也不囉嗦,特別介紹下mongo的批量查詢和批量插入。api
以前看過一遍博客,http://blog.sina.com.cn/s/blog_56545fd301013zav.html服務器
介紹說批量插入和普通插入同樣,正巧工做須要,有大約3000w左右數據(1000w遺留數據須要剔除)須要遷移,那麼我就進行了數據源庫的批量查詢和新庫的普通插入性能
(1)批量查詢可使用遊標的形式ui
/** * * @use 獲取mongo遊標 * @param collectionName 集合名 * query 查詢項 * batchSize 分頁大小 * @return */ public MongoCursor<Document> findCursor(String collectionName,BasicDBObject query,int batchSize){ MongoCollection<Document> collection = database.getCollection(collectionName); //根據query查詢 FindIterable<Document> iterable = collection.find(query).batchSize(batchSize); MongoCursor<Document> cursor = iterable.iterator(); return cursor; } /** * * @use 獲取mongo遊標 * @param collectionName 集合名 query 查詢項 batchSize 分頁大小 * @return */ public MongoCursor<Document> findCursor(String collectionName, Bson query, Bson keys, int batchSize) { MongoCollection<Document> collection = database.getCollection(collectionName); // 根據query查詢 FindIterable<Document> iterable = collection.find(query).batchSize(batchSize); if (keys != null) { iterable.projection(keys); } MongoCursor<Document> cursor = iterable.iterator(); return cursor; }
java-mongo-driver 使用batchSize設置遊標大小,一次性讀出多少條數據,我通常設置500一讀,也能夠查詢某列,能夠條件查詢,比較方便spa
(2)普通插入和批量插入的比較日誌
在插入的時候看了那篇博客,先用普通插入一條一條插入數據,結果發現插入效率1分鐘1w左右 效率過低,而後使用了批量插入,發現mongo批量插入也有瓶頸,一樣是600w數據,5000條一插入大約須要半小時,10000條一插入須要1小時,並且後來發現批量插入也和當時服務器的負載有直接關係,不過大約5000條一插入性能一致比較好。code
/** * 批量插入指定集合數據 * * @param collectionName * @param doc */ public void insertMore(String collectionName, List<Document> docs) { MongoCollection<Document> collection = database.getCollection(collectionName); //若是遇到插入失敗 不終止 collection.insertMany(docs, new InsertManyOptions().ordered(false)); }
最好使用insertMany(document,options)這個方法,將options至爲false,在批量插入的時候遇到異常不會終止後面的插入,不然數據遷移會丟失不少數據htm
(3)遺留問題
在這個過程當中,老是偶爾有惟一約束重複插入的問題,並且日誌記錄每次重複的數據都不太同樣,且保證原數據源沒有重複數據,新庫是空的無任何數據,一直想知道mongo插入是否有重試機制而致使的呢?
二. mongo主從節點
一個mongo集羣也有主從的概念
test:PRIMARY> 表明主節點
test:SECONDARY>表明從節點
若是使用的從節點,是沒法查詢和操做collection的,須要執行db.getMongo().setSlaveOk();
其次,若是主節點掛了重啓,主節點確定就變換了,在登錄的時候要注意下。
三.mongo索引創建
給username+uid創建惟一約束 db.users.ensureIndex({'username':1,'uid':1},{'unique':true});
mongo是一種key-value的形式,查詢效率極高,不過發現創建了約束以後查詢這些列的效率下降了很多。
四.mongo索引
關於dropDups:true 刪除重複數據並建立惟一索引,在生產環境使用mongo3發現並無做用。