Mongo的一些心得

一.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發現並無做用。

相關文章
相關標籤/搜索