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发现并无做用。

相关文章
相关标签/搜索