使用Java更新MongoDB中的嵌入式文档

使用Java更新MongoDB中的嵌入式文档,java,arrays,mongodb,Java,Arrays,Mongodb,我是Mongo的新手,我正在尝试向Mongo中的对象数组添加一个新字段。我有一个学生的集合,里面有学生的物品。以下是我的文档的外观: Student{ "id":"...", "Name":"...", "username":"...", "courses":[ { "course name":"English", "course id"

我是Mongo的新手,我正在尝试向Mongo中的对象数组添加一个新字段。我有一个学生的集合,里面有学生的物品。以下是我的文档的外观:

Student{
       "id":"...",
       "Name":"...",
       "username":"...",

       "courses":[
               {
                  "course name":"English",
                  "course id":"ENC1101",                                    
               },
               {
                  "course name":"Math",
                  "course id":"MA1453",                                   
               },
               {
                  "course name":"Biology",
                  "course id":"BA1403",                                    
               }


     ]
}
因此,我想做的是为每门课程(针对学生集合中的每个学生)添加一个新字段,称为模块,这就是我尝试的:

DBCursor cursor = students.find();
while(cursor.hasNext()) {
     BasicDBObject modules = new BasicDBObject("modules", "moduleID");

     BasicDBObject courses = new BasicDBObject("courses", modules); 

     BasicDBObject withSet = new BasicDBObject("$push", courses);

     students.update(cursor.next(), withSet);
}

但是,这会在课程数组中添加一个新元素,而不是每个课程。我不知道如何在此数组中循环,为数组中的每个对象添加一个字段,以便获得任何帮助。

$push
操作符附加到数组中。这就是为什么您的集合会添加一个新元素。一种解决方案是用
$set
操作符替换整个数组。迭代学生,对于每个学生的课程,将
模块ID
附加到
课程
元素:

    DBCursor cursor = students.find();
    while (cursor.hasNext()) {
        final DBObject student = cursor.next();
        BasicDBList courses = (BasicDBList) student.get("courses");
        for (Object course : courses) {
            ((BasicDBObject) course).append("modules", "moduleID");
        }
        students.update(
                        new BasicDBObject("id","test"), //update query
                        new BasicDBObject("$set", new BasicDBObject("courses", courses))
        );
    }