Mongo的一些心得

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

一.mongo-java-driver

    项目中使用的是java原生mongo操作api,个人觉得,不是那么的方便,资料好像也比较少,只有官方文档可供使用

    基础用法不再啰嗦,特别介绍下mongo的批量查询和批量插入。

    之前看过一遍博客,http://blog.sina.com.cn/s/blog_56545fd301013zav.html

介绍说批量插入和普通插入一样,正巧工作需要,有大约3000w左右数据(1000w遗留数据需要剔除)需要迁移,那么我就进行了数据源库的批量查询和新库的普通插入

(1)批量查询可以使用游标的形式

/**
	 * 
	 * @use 获取mongo游标
	 * @param collectionName 集合名
	 *     			  query 查询项
	 *     			  batchSize 分页大小
	 * @return
	 */
	public MongoCursor findCursor(String collectionName,BasicDBObject query,int batchSize){
		MongoCollection collection = database.getCollection(collectionName);
		//根据query查询
		FindIterable iterable = collection.find(query).batchSize(batchSize);
		MongoCursor cursor = iterable.iterator();
		return cursor;
	}
	
	
	/**
     * 
     * @use 获取mongo游标
     * @param collectionName 集合名 query 查询项 batchSize 分页大小
     * @return
     */
    public MongoCursor findCursor(String collectionName, Bson query, Bson keys,
                    int batchSize) {
        MongoCollection collection = database.getCollection(collectionName);
        // 根据query查询
        FindIterable iterable = collection.find(query).batchSize(batchSize);
        if (keys != null) {
            iterable.projection(keys);
        }
        MongoCursor cursor = iterable.iterator();
        return cursor;
    }

java-mongo-driver 使用batchSize设置游标大小,一次性读出多少条数据,我一般设置500一读,也可以查询某列,可以条件查询,比较方便

(2)普通插入和批量插入的比较

      在插入的时候看了那篇博客,先用普通插入一条一条插入数据,结果发现插入效率1分钟1w左右 效率太低,然后使用了批量插入,发现mongo批量插入也有瓶颈,同样是600w数据,5000条一插入大约需要半小时,10000条一插入需要1小时,而且后来发现批量插入也和当时服务器的负载有直接关系,不过大约5000条一插入性能一致比较好。

/**
     * 批量插入指定集合数据
     * 
     * @param collectionName
     * @param doc
     */
    public void insertMore(String collectionName, List docs) {

        MongoCollection collection = database.getCollection(collectionName);
        //如果遇到插入失败 不终止
        collection.insertMany(docs, new InsertManyOptions().ordered(false));
    }

最好使用insertMany(document,options)这个方法,将options至为false,在批量插入的时候遇到异常不会终止后面的插入,否则数据迁移会丢失很多数据


(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发现并没有作用。

转载于:https://my.oschina.net/liyixiangBlog/blog/512302

你可能感兴趣的:(Mongo的一些心得)