MongoDB Spring Boot中嵌套在对象中的数组对象上的CRUD操作
我有一个MongoDB对象,它是使用映射创建的。我正在尝试添加CRUD方法来编辑和删除对象中的数组中的对象。这就是JSON结构的外观:MongoDB Spring Boot中嵌套在对象中的数组对象上的CRUD操作,mongodb,spring-boot,Mongodb,Spring Boot,我有一个MongoDB对象,它是使用映射创建的。我正在尝试添加CRUD方法来编辑和删除对象中的数组中的对象。这就是JSON结构的外观: [ { "id": "1", "courses": { "Spring": [ { "subject": "Electrical Engineering",
[
{
"id": "1",
"courses": {
"Spring": [
{
"subject": "Electrical Engineering",
. . .
"id": "123"
}
],
"Fall": [
{
"subject": "Electrical Engineering",
. . .
"id": "456"
},
{
"subject": "Computer Science",
. . .
"id": "789"
}
]
}
}
]
我试图使用pull()方法删除该对象,但出现了一个异常
org.springframework.dao.DataAccessResourceFailureException: Timed out after 30000 ms while waiting to connect.
下面是服务类中尝试删除的方法
public void delete(String semester, String id){
// Object.Array
String object = "courses." + semester;
Update update = new Update().pull(object, Collections.singletonMap("_id", id));
mongoOps.updateMulti(new Query(), update, Courses.class);
}
Courses.java
@文件
公共课{
@身份证
私有字符串ID;
私人字符串学期;
. . .
}
Java
@文件
公开课学期{
@身份证
字符串id;
Map courses=newhashmap();
...
}
在Discord的大量搜索和指导下,我终于找到了解决方案。我可能已经搜索了StackOverflow的所有内容,并尝试了许多实现,但似乎没有任何效果。因此,我们的想法是找到数组并通过包含id的对象值进行查询。然后,只需根据需要使用更新函数,并使用MongoTemplate保存即可
请注意,MongoDB将id存储为\u id,而JSON仅将其返回为id。这一认识是使其发挥作用的最后一步
@Autowired
MongoTemplate mongoTemplate;
public void delete(String semester, int id){
// Set the query as Object.Array_name.property
Query query = new Query();
query.addCriteria(Criteria.where("courses.Spring._id").is("123"));
// Now, remove the entire object containing the query
Update update = new Update();
update.unset("course_list.Spring2022.$");
mongoTemplate.updateMulti(query, update, Semester.class);
}
现在,如果要编辑,请使用SET()函数应用相同的概念
@Autowired
MongoTemplate mongoTemplate;
public void delete(String semester, int id){
// Set the query as Object.Array_name.property
Query query = new Query();
query.addCriteria(Criteria.where("courses.Spring._id").is("123"));
// Now, remove the entire object containing the query
Update update = new Update();
update.unset("course_list.Spring2022.$");
mongoTemplate.updateMulti(query, update, Semester.class);
}
public void edit(Courses courses) {
Query query = new Query();
query.addCriteria(Criteria.where("courses.Spring._id").is("CS332"));
Update update = new Update();
update.set("course_list.Spring2022.$", courses);
mongoTemplate.updateMulti(query, update, Semester.class);
}