批量更新或者修改
public void saveOnlineStatusList(List<UserOnline> list) {
if (CollectionUtils.isEmpty(list)) {
return;
}
List<Pair<Query, Update>> updateList = new ArrayList<>(list.size());
BulkOperations operations = sdkMongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "userOnline");
list.forEach(data -> {
//如果query查询到有数据就更新
Query query = new Query(new Criteria("_id").is(data.getId()));
Update update = new Update();
//如果userId是主键,必须使用setOnInsert()
update.set("productId",data.getProductId());
update.set("userId",data.getUserId());
update.set("updateTime",data.getUpdateTime());
Pair<Query, Update> updatePair = Pair.of(query, update);
updateList.add(updatePair);
});
operations.upsert(updateList);
BulkWriteResult result = operations.execute();
log.info("数量:{}", list.size());
}
备注:
BulkOperations.BulkMode.UNORDERED 和 BulkOperations.BulkMode.ORDERED的区别:
UNORDERED是平行处理,即使某条记录出错了,其余的也会继续处理;
ORDERED是队列排序处理,只要中途有个失败了,那么后续的操作流程就会终止了。