save() 方法失败,因为它试图将以下文档插入到集合中:{"$push":{"resources":[a list of resources]}},并且 "$push" 不是有效的键姓名。
从您的问题来看,您似乎正在尝试将另一个资源文档添加到嵌入文档列表“resources”中,嵌入文档匹配 {“itemID”:“1”},在“itemList”内部。它是否正确?
处理嵌入文档的层很棘手,但可以做到:
以下是使用 JS shell 将以下文档插入“资源”列表的方法:
> 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
“$push”修饰符的文档也在“更新”页面上:
http ://www.mongodb.org/display/DOCS/Updating#Updating-%24push
从发布的代码来看,“资源”似乎是一个列表。您需要使用的方法可能是 $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 的成员将能够提供帮助。