MongoDB Spring Boot中嵌套在对象中的数组对象上的CRUD操作

MongoDB Spring Boot中嵌套在对象中的数组对象上的CRUD操作,mongodb,spring-boot,Mongodb,Spring Boot,我有一个MongoDB对象,它是使用映射创建的。我正在尝试添加CRUD方法来编辑和删除对象中的数组中的对象。这就是JSON结构的外观: [ { "id": "1", "courses": { "Spring": [ { "subject": "Electrical Engineering",

我有一个MongoDB对象,它是使用映射创建的。我正在尝试添加CRUD方法来编辑和删除对象中的数组中的对象。这就是JSON结构的外观:

[
  {
    "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);
       
    }