代码之家  ›  专栏  ›  技术社区  ›  user8363477

Spring Boot Mongo在阵列中插入元素

  •  8
  • user8363477  · 技术社区  · 8 年前

    想了解如何在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阵列

    下面是我编写的代码片段。目前,我正在为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
    }
    

    联系人日期:

    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 回复  |  直到 8 年前
        1
  •  5
  •   s7vr    8 年前

    无法向上插入数组。

    因此,为了模拟愉快路径场景中阵列的upsert,您必须在两个不同的更新中进行。

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

    本质上,我们首先尝试定位具有匹配名称的数组元素,并尝试在成功时设置phone值,修改后的计数应大于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

        2
  •  0
  •   notme    8 年前

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

    updateCmd.addToSet("myContacts", person)
    

    希望这有帮助。