我有JSON对象:
{“_ id”:“1”,“_ class”:“com.model.Test”,“projectList”:[{ “projectID”:“Spring”,“resourceIDList”:[“Mark”,“David”]}, {“projectID”:“MongoDB”,“resourceIDList”:[“Nosa]}
我需要能够删除Project“Spring”的resourceIDList并分配一个新的ResourceIDList。
ResourceIDList只是List
每当我尝试使用以下内容时,DB上都不会更新任何内容:
Query query = new Query(where("_id").is("1").and("projectID").is("Spring"));
mongoOperations.updateMulti( query,new Update().set("ressourceIDList", populateResources()), Test.class);
答案 0 :(得分:2)
替换匹配{“projectList.projectID”:“Spring”}的嵌入式文档中的resourceIDList可以在JavaScript shell中完成,如下所示: (我喜欢从JS shell开始,因为它比Java简洁,语法相对简单。然后JS的示例可以应用于任何语言驱动程序。)
> db.collection.update({_id:"1", "projectList.projectID":"Spring"}, {$set:{"projectList.$.resourceIDList":["Something", "new"]}})
使用“$”运算符修改嵌入文档的文档可以在“更新”文档的“$ location operator”部分找到: 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 Driver中完成,如下所示:
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所需的操作。