1. 程式人生 > 實用技巧 >MongoDB實現批量存在執行修改,不存在執行新增(BulkWrite)

MongoDB實現批量存在執行修改,不存在執行新增(BulkWrite)

最近使用mongodb實現一個需求,需要批量處理資料,並且存在則修改,不存在則新增,updateMany方法,無法達到要求,經查,發現mongodb中存在一個BulkWrite方法可以實現該需求

使用如下命令建立用於測試的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<Document> getCollection(MongoTemplate mongoTemplate){ MongoDatabase mongoDatabase = mongoTemplate.getMongoDbFactory().getMongoDatabase(mockdbName); MongoCollection<Document> 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<String> dataList) {
        try {
            MongoCollection
<Document> collection = MongoCons.getCollection(mongoTemplate); List<WriteModel<Document>> list = new ArrayList<>(); Iterator<String> 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<Document> um = new UpdateOneModel<Document>(filter, update, new UpdateOptions().upsert(true)); list.add(um); iterator.remove(); } collection.bulkWrite(list, new BulkWriteOptions().ordered(false)); } catch (Exception e) { logger.error("",e); } }