关于MongoDB中如何做到对已有数据插入时更新字段,不存在时则插入新的Document
程序员文章站
2022-05-28 11:15:53
...
背景需求:
* 比如我们有这样一个需求,有两个excel中的数据,需要插入到数据库中,这个两个excel中的数据有些字段都是一样的,比如本例所写的,电台名称是一样的,省市县也是一样的,而不一样的是波段是调频(FM) 调幅(AM). * `
这里普及一下:AM 调幅,中波
FM 调频,微波
代表广播电台发射信号使用的技术和接收设备(收音机)接受的制式.
微波传输,信号质量高,传输成本低,发射功率小,覆盖范围小,受地理因素影响较大,一般作为城市广播的首选.比如你的家乡城市台,一般可以通过FM收听.
中波传输,信号质量稳定,传出成本大,发射功率大,覆盖范围广,靠天馈传输,受天气条件影响较大,一般作为远距离传输的首选.比如中国国际广播电台,*人民广播电台等.`
所以需要将相同电台名称、省市县相同的FM和AM写为一条记录!这时便可以用到MongoDB的upsert操作!
@Override
public boolean saveRadioFrequencyDO(List<RadioFrequencyDO> radioFrequencyDO, String type) throws Exception {
boolean flag = true;
MongoConfiguration mongoConfiguration = new MongoConfiguration();
mongoTemplate = mongoConfiguration.mongoTemplate();
if (radioFrequencyDO != null) {
for (int i = 0; i < radioFrequencyDO.size(); i++) {
Query query = new Query();
Update update = new Update();
//这些都是查询条件,用来判断数据库中有没有符合这些条件的记录!update方法会首先查找与第一个参数匹配的记录,在用第二个参数更新之,如果找不到与第一个参数匹配的的记录,就插入一条(upsert 的名字也很有趣是个混合体:update+insert)query.addCriteria(Criteria.where("radioName").is(radioFrequencyDO.get(i).getRadioName()));
query.addCriteria(Criteria.where("province").is(radioFrequencyDO.get(i).getProvince()));
query.addCriteria(Criteria.where("city").is(radioFrequencyDO.get(i).getCity()));
query.addCriteria(Criteria.where("county").is(radioFrequencyDO.get(i).getCounty()));
query.addCriteria(Criteria.where("transmittingPower").is(radioFrequencyDO.get(i).getTransmittingPower()));
if (type != null && type.equals("AM")) {
//如果有query相匹配的记录,则加入transmittingFrequencyOfAM这个字段,或者更新这个字段,如果找不到相匹配的,则直接重新插入一条记录,并且加入transmittingFrequencyOfAM这个字段
update.set("transmittingFrequencyOfAM", radioFrequencyDO.get(i).getTransmittingFrequencyOfAM());
} else {
update.set("transmittingFrequencyOfFM", radioFrequencyDO.get(i).getTransmittingFrequencyOfFM());
update.set("launchPlat", radioFrequencyDO.get(i).getLaunchPlat());
}
mongoTemplate.upsert(query, update, RadioFrequencyDO.class);
}
} else {
flag = false;
}
return flag;
}
上一篇: 复印书本
下一篇: 业务上可能运用到的字符提取