1

我有 JSON 对象:

{“_id”:“1”,“_class”:“com.model.Test”,“projectList”:[{“projectID”:“Spring”,“resourceIDList”:[“Mark”,“David”]}, {“projectID”:“MongoDB”,“resourceIDList”:[“Nosa]}

我需要能够删除项目“Spring”的 resourceIDList 并分配一个新的 ResourceIDList。

ResourceIDList 只是列表

每当我尝试使用以下内容时,DB 都没有更新:

 Query query = new Query(where("_id").is("1").and("projectID").is("Spring"));    

 mongoOperations.updateMulti( query,new Update().set("ressourceIDList",  populateResources()), Test.class);
4

1 回答 1

2

替换嵌入文档中匹配 {"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 完成的工作。

于 2012-04-11T21:53:31.853 回答