更新使用MongoDB的
数组我有JSON这样的:更新使用MongoDB的
{ "_id" : "1", "_class" : "com.model.Test", "itemList" : [ { "itemID" : "1", "itemName" : "Foo", "resources" : [ { "resourceID" : "1", "resourceName" : "Foo Test1", }, { "resourceID" : "2", "resourceName" : "Foo Test2", } ] } ] }
我需要能够更新的资源列表。 我也做了以下内容:
BasicDBObject updateQuery = new BasicDBObject();
updateQuery.put("id", "1");
BasicDBObject updateCommand = new BasicDBObject();
List<Resource> resources = populateResources();//Fetch a new list of Resources
updateCommand.put("$push", new BasicDBObject("resources", resources));
MongoOperations mongoOperations = mongoConfiguration.getMongoTemplate();
DBCollection db = mongoOperations.getCollection("myCollection");
db.save(updateCommand);
我得到follwoing错误:
java.lang.IllegalArgumentException: fields stored in the db can't start with '$' (Bad Key: '$push')
当我用:
db.update(updateQuery, updateCommand, true, true);
我有以下异常:
java.lang.IllegalArgumentException: can't serialize class com.model.Test
我试过了: db.updateMulti(updateQuery,updateCommand); 我没有得到任何例外,也没有任何更新发生在文件中。
那么我在这里错过了什么!
save()方法失败,因为它试图将以下文档插入到集合中:{“$ push”:{“resources”:[资源列表]}}和“$ push”是不是有效的密钥名称。
从您的问题看来,您似乎正尝试将另一个资源文档添加到嵌入文档列表中的嵌入文档“资源”,嵌入文档匹配{“itemID”:“1”},在“ itemList中”。它是否正确?
与嵌入文档的层处理是棘手的,但它可以做到:
这里是如何在以下文件可以被插入到“资源”使用JS壳名单:
> var docToInsert = { "resourceID" : "3", "resourceName" : "Foo Test3"}
> db.myCollection.update({_id:"1", "itemList.itemID":"1"}, {"$push":{"itemList.$.resources":docToInsert}})
> db.myCollection.find().pretty()
{
"_class" : "com.model.Test",
"_id" : "1",
"itemList" : [
{
"itemID" : "1",
"itemName" : "Foo",
"resources" : [
{
"resourceID" : "1",
"resourceName" : "Foo Test1"
},
{
"resourceID" : "2",
"resourceName" : "Foo Test2"
},
{
"resourceID" : "3",
"resourceName" : "Foo Test3"
}
]
}
]
}
>
文档 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
的“$推”修改的文档也是“更新”页面上:在使用“$”位置运营商更新嵌入文档可以将“更新”文件中找到 http://www.mongodb.org/display/DOCS/Updating#Updating-%24push
从发布的代码看起来好像“resources”是一个列表。这可能是你需要使用的方法是$ pushAll,用于添加多个值的列表: http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll
使用Java驱动程序,上面的插件可以做到像这样:
Mongo m = new Mongo("localhost", 27017);
DB db = m.getDB("test");
DBCollection myColl = db.getCollection("myCollection");
BasicDBObject docToInsert = new BasicDBObject("resourceID", "3");
docToInsert.put("resourceName", "Foo Test3");
BasicDBObject updateQuery = new BasicDBObject("_id", "1");
updateQuery.put("itemList.itemID", "1");
BasicDBObject updateCommand = new BasicDBObject("$push", new BasicDBObject("itemList.$.resources", docToInsert));
myColl.update(updateQuery, updateCommand);
System.out.println(myColl.findOne().toString());
上述输出如下:
{ "_class" : "com.model.Test" , "_id" : "1" , "itemList" : [ { "itemID" : "1" , "itemName" : "Foo" , "resources" : [ { "resourceID" : "1" , "resourceName" : "Foo Test1"} , { "resourceID" : "2" , "resourceName" : "Foo Test2"} , { "resourceID" : "3" , "resourceName" : "Foo Test3"}]}]}
希望上面会提高你如何更新嵌入文档与使用Java驱动程序Mongo的工作原理的理解。我注意到这个问题也与Spring有关(“mongoOperations”是Spring包中的一个类),我不太熟悉这个问题。如果您的更新仍然存在问题,或许更熟悉Spring的社区其他成员将能够提供帮助。
谢谢Marc.That非常有帮助。 – Echo 2012-04-10 17:59:29