繁体   English   中英

数组中的Spring Boot Mongo Upsert元素

[英]Spring Boot Mongo Upsert elements in an array

想了解如何在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. 名字
  2. myContacts数组

下面是我工作过的代码片段。 当前,我使用MongoDB的addtoSet运算符作为myContacts,但是该行为似乎只会向数组添加一个值,除非该值已经存在。

人类:

@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
}

联系人更新:

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。如果为零,则必须在数组中插入一个新文档,该文档使用push for这个。 这将对新的数组元素进行更新。

类似于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);
            }
        }
    }
}

参考: 在MongoDB中更新嵌套数组文档

我相信问题出在addSet部分。 尝试这个。 删除addToSet的for循环。 用下面替换

updateCmd.addToSet("myContacts", person)

希望这可以帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM