您的位置:首页 > 编程语言 > Go语言

Mongo的一些心得

2015-09-29 14:27 471 查看
一.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<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一读,也可以查询某列,可以条件查询,比较方便

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

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

/**
* 批量插入指定集合数据
*
* @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,在批量插入的时候遇到异常不会终止后面的插入,否则数据迁移会丢失很多数据

(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发现并没有作用。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: