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