Spring Boot Mongo数组中的Upsert元素

时间:2018-01-02 15:29:43

标签: java spring mongodb spring-boot spring-data-mongodb

想要了解如何在MongoDB中为给定文档在数组中执行upsert操作。

我有以下json文档

  {
        "firstName": "John",
        "lastName": "Paul",
        "contact": {
            "contactGroup":"Business",
            "myContacts": [{
                    "name": "Jeff",
                    "phone": "222 - 572 - 8754"
                },
                {
                    "name": "Joe",
                    "phone": "456 - 875 - 4521"
                }
            ]
        }
    }

我想在以下级别执行upsert操作:

  1. 的firstName
  2. myContacts array
  3. 以下是我参与过的代码段。目前,我正在为myContacts使用MongoDB的addtoSet运算符,但行为似乎只是为数组添加一个值,除非该值已经存在。

    人员类:

    @Document
    public class Person{
    
        @Id
        private String id;
        private String firstName;
        private String lastName;
        private Contact contact;
        //Setter and Getter methods
    }
    

    联系班级:

    public class Contact{
        private String contactGroup;
        private List<MyContacts> myContacts;
    
        //Setter & Getter methods
    }
    

    MyContacts课程:

    public class MyContacts{
    
        private String contactName;
        private String contactPhone;
    
        //Setter and Getter methods
    }
    

    ContactsUpdate:

    public class ContacsUpdate {
    
    @Autowired
    private MongoOperations mongoOps;
    
    
        // This method receives list of person objects
        public void upsertMongoContact(List<Person> persons) {
    
            for (Person person : persons) {
    
                Update updateCmd = new Update();
                Query query = new Query();
                query.addCriteria((Criteria.where("firstName").is((person.firstName()))));
    
                for (MyContacts contact : person.getContact().getmyContacts()) {
                    updateCmd.addToSet("contact.myContacts.", contact);
                }
                mongoOps.findAndModify(query, updateCmd, FindAndModifyOptions.options().upsert(true), Person.class);
            }
        }
    
    }
    

    有没有办法根据名称更新mycontacts数组。如果不执行插入操作。

2 个答案:

答案 0 :(得分:1)

无法插入数组。

因此,要为快乐路径场景模拟数组的upsert,您必须在2个不同的更新中执行此操作。

下面的代码将查找具有匹配名称的数组元素,当发现它将使用较新的电话号码更新匹配的元素;如果没有找到,它将插入一个带有姓名和电话号码的新数组元素。

本质上我们首先尝试找到具有匹配名称的数组元素,并尝试在成功时设置电话值,修改后的计数应大于0。 如果它为零,我们必须在数组中插入一个新文档,该文档使用了push。这将使用新的数组元素进行upsert。

类似于Spring Mongo 2.0.2版本

 public void upsertMongoContact(List<Person> persons) {

    for (Person person : persons) {
        for (MyContacts contact : person.getContact().getmyContacts()) {
            Query sQuery = new Query();
            Criteria sCriteria = Criteria.where("firstName").is((person.firstName()));
            sCriteria.and("contact.myContacts.name").is(contact.name());
            sQuery.addCriteria(sCriteria);
            Update sUpdate = new Update();
            sUpdate.set("contact.myContacts.$.phone", person.phone());
            UpdateResult sUpdateResult = mongoOps.updateFirst(sQuery, sUpdate, Person.class);
            if (sUpdateResult.getModifiedCount() == 0) {
                Query pQuery = new Query();
                Criteria pCriteria = Criteria.where("firstName").is((person.firstName()));
                pQuery.addCriteria(pCriteria);
                Update pUpdate = new Update();
                pUpdate.push("contact.myContacts", contact);
                mongoOps.updateFirst(pQuery, pUpdate, Person.class);
            }
        }
    }
}

参考:Updating nested array document in MongoDB

答案 1 :(得分:0)

我认为问题出在addSet部分。 试试这个。  删除addToSet的for循环。  替换为下面的

updateCmd.addToSet("myContacts", person)

希望这有帮助。