想要了解如何在MongoDB中为给定文档在数组中执行upsert操作。
我有以下json文档
{
"firstName": "John",
"lastName": "Paul",
"contact": {
"contactGroup":"Business",
"myContacts": [{
"name": "Jeff",
"phone": "222 - 572 - 8754"
},
{
"name": "Joe",
"phone": "456 - 875 - 4521"
}
]
}
}
我想在以下级别执行upsert操作:
以下是我参与过的代码段。目前,我正在为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数组。如果不执行插入操作。
答案 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);
}
}
}
}
答案 1 :(得分:0)
我认为问题出在addSet部分。 试试这个。 删除addToSet的for循环。 替换为下面的
updateCmd.addToSet("myContacts", person)
希望这有帮助。