替换嵌入文档中匹配 {"projectList.projectID":"Spring"} 的 resourceIDList 可以在 JavaScript shell 中完成,如下所示:(我喜欢从 JS shell 开始,因为它比 Java 更简洁,语法是相对简单。然后可以将 JS 的示例应用于任何语言驱动程序。)
> db.collection.update({_id:"1", "projectList.projectID":"Spring"}, {$set:{"projectList.$.resourceIDList":["Something", "new"]}})
有关使用“$”运算符修改嵌入文档的文档可以在“更新”文档的“$ 位置运算符”部分找到:
http ://www.mongodb.org/display/DOCS/Updating#Updating- The%24positionaloperator
在“Dot Notation (Reaching into Objects)”文档中有更多关于嵌入文档的信息:
http ://www.mongodb.org/display/DOCS/Dot+Notation+%28Reaching+into+Objects%29
以上可以在Java驱动程序中完成,如下所示:
Mongo m = new Mongo("localhost", 27017);
DB db = m.getDB("test");
DBCollection myColl = db.getCollection("collection");
ArrayList<String> newResourceIDList = new ArrayList<String>();
newResourceIDList.add("Something");
newResourceIDList.add("new");
BasicDBObject myQuery = new BasicDBObject("_id", "1");
myQuery.put("projectList.projectID", "Spring");
BasicDBObject myUpdate = new BasicDBObject("$set", new BasicDBObject("projectList.$.resourceIDList", newResourceIDList));
myColl.update(myQuery, myUpdate);
System.out.println(myColl.findOne().toString());
如果您有多个匹配 {"projectList.projectID" : "Spring"} 的文档,您可以使用 multi = true 选项一次更新它们。使用 Java 驱动程序,它看起来像这样:
myColl.update(myQuery, myUpdate, false, true);
上面“false”代表“upsert=false”,“true”代表“multi=true”。这在“更新”命令的文档中进行了解释:
http ://www.mongodb.org/display/DOCS/Updating#Updating-update%28%29
不幸的是,我不熟悉 Spring 框架,所以我无法告诉您如何使用“mongoOperations”类来做到这一点。希望以上内容能增进您对如何在 Mongo 中更新嵌入式文档的理解,并且您将能够完成您需要使用 Spring 完成的工作。