关于MongoDB中如何做到对已有数据插入时更新字段,不存在时则插入新的Document

原创 2017年05月19日 09:13:41

背景需求:

 *  比如我们有这样一个需求,有两个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;
    }
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Ant自动编译打包android项目

背景:     Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其当要讲应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不且实际了,这时候我们用到Ant帮我...

谈一谈闭包

每次打开Atom准备写文章的时候, 都要纠结如何开头… 烦~~ 今天这篇文章我们来探讨一下闭包, 因为我在查阅很多资料时, 发现这些文章对于闭包的理解很多都是有出入的, 所以今天我们来探讨一下什么才是...

docker初探---第一季

现在docker火的程度已经不用再多说了,而且很多大型的互联网公司都已经把自己的项目部署到了docker上以方便运维人员的维护,例如某东。 作为一个java开发人员,不需要像运维人员那样对docke...

WebSocket 协议及服务端实现

WebSocket 笔记 协议理解及服务器端实现 Bottle,  May 24 2016        bottle@fridayws.com        前言: HTML 从1993年的HTML...

自动化项目配置或用例文件格式推荐--yaml

写了好多关于selenium的文章,今天换个口味,推荐一个文件格式 – yaml,以及对应的Python库 – PyYaml。可以用之作为你自动化测试框架的配置文件或者用例文件。yaml是一种比xml...

Spring-Cloud 学习之旅 --- 快速开始(一)

Spring-Cloud 快速入门
  • mr_pr
  • mr_pr
  • 2017-02-15 11:05
  • 370

Java语言启动windows 可执行程序

代码如下: try { Process ps = Runtime.getRuntime().exec(AbsolutePath);//AbsolutePath 表示可执行程序的绝对路径 Th...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)