我有 JSON 对象:
{ "_id" : "1", "_class" : "com.model.Test", "projectList" : [ { "projectID" : "Spring", "resourceIDList" : [ "Mark","David" ] }, { "projectID" : "MongoDB", "resourceIDList" : [ "Nosa ] }
我需要能够删除项目“Spring”的resourceIDList 并分配一个新的ResourceIDList。
ResourceIDList 只是列表
每当我尝试使用以下内容时,数据库中都不会更新任何内容:
Query query = new Query(where("_id").is("1").and("projectID").is("Spring"));
mongoOperations.updateMulti( query,new Update().set("ressourceIDList", populateResources()), Test.class);
最佳答案
替换嵌入文档中匹配 {"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 有关嵌入文档的更多信息,请参阅“点表示法(触及对象)”文档: 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 完成您需要做的事情。
关于java - 使用 MongoDB 删除新数组并将其添加到 JSON 对象中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10113558/