热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

MongoDB实现批量存在执行修改,不存在执行添加(BulkWrite)

最近使用mongodb实现一个需求,需要批量处理数据,并且存在则修改,不存在则添加,updateMany方法,无法达到要求,经查,发现mongodb中存在一个BulkWrite方法

最近使用mongodb实现一个需求,需要批量处理数据,并且存在则修改,不存在则添加,updateMany方法,无法达到要求,经查,发现mongodb中存在一个BulkWrite方法可以实现该需求,该操作可实现类似于mysql的insert into ... on duplicate key udpdate ...

使用如下命令创建用于测试的db和collection以及添加index并查看

use mockdb
db.mockcoll.createIndex({"flag":1})
db.mockcoll.getIndexes()

mockcoll中只存在一个字段flag,并在该字段建立唯一索引

下面为代码示例

public interface MongoCons {

    String mockdbName = "mockdb";
    String mockcollName = "mockcoll";
    
    static MongoCollection getCollection(MongoTemplate mongoTemplate){
        MongoDatabase mongoDatabase = mongoTemplate.getMongoDbFactory().getMongoDatabase(mockdbName);
        MongoCollection collection = mongoDatabase.getCollection(mockcollName);
        return collection;
    }
    
}

 

@Component
public class MongoBulkDao {

    private Logger logger = LoggerFactory.getLogger(MongoBulkDao.class);
    @Autowired
    private MongoTemplate mongoTemplate;

    public void addOrUpdate(List dataList) {
        try {
            MongoCollection collection = MongoCons.getCollection(mongoTemplate);

            List> list = new ArrayList<>();

            UpdateOptions upsert = new UpdateOptions().upsert(true);
            Iterator iterator = dataList.iterator();
            String next = null;
            while (iterator.hasNext()) {
                next = iterator.next();
                BasicDBObject filter = new BasicDBObject().append("flag", next);
                BasicDBObject update = new BasicDBObject().append("$set", new BasicDBObject().append("flag", next));

                UpdateOneModel um = new UpdateOneModel(filter, update, upsert);
                list.add(um);
                // 删除掉不需要的数据
                iterator.remove();
            }

            collection.bulkWrite(list, new BulkWriteOptions().ordered(false));
        } catch (Exception e) {
            logger.error("", e);
        }
    }

}

 

 上述代码那种调用了bulkWrite的其中一个构造方法,new BulkWriteOptions().ordered(false)中orderd默认为ture,即如果其中一条执行错误,后面的将不再执行,为false,其中的一条执行错误,跳过去,继续执行下面的命令。

 


推荐阅读
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有