Phương thức save () không thành công vì nó đang cố chèn tài liệu sau vào bộ sưu tập:{"$ push":{"resources":[a list of resources]}} và "$ push" không phải là khóa hợp lệ Tên.
Từ câu hỏi của bạn, có vẻ như bạn đang cố gắng thêm một tài liệu tài nguyên khác vào danh sách tài liệu được nhúng, "tài nguyên", bên trong tài liệu nhúng khớp với {"itemID":"1"}, bên trong "itemList". Điều này có chính xác không?
Xử lý các lớp tài liệu nhúng rất phức tạp, nhưng có thể thực hiện được:
Đây là cách tài liệu sau có thể được chèn vào danh sách "tài nguyên" bằng cách sử dụng 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"
}
]
}
]
}
>
Bạn có thể tìm thấy tài liệu về cách sử dụng toán tử vị trí "$" để cập nhật tài liệu nhúng trong tài liệu "Đang cập nhật": http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator
Tài liệu về công cụ sửa đổi "$ push" cũng có trên trang "Đang cập nhật": http://www.mongodb.org/display/DOCS/Updating#Updating-%24push
Từ mã đã đăng, có vẻ như "tài nguyên" là một danh sách. Có thể phương thức bạn cần sử dụng là $ pushAll, được sử dụng để thêm nhiều giá trị vào danh sách: http://www.mongodb.org/display/DOCS/Updating#Updating-%24pushAll
Sử dụng trình điều khiển Java, việc chèn ở trên có thể được thực hiện như vậy:
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());
Kết quả trên cho kết quả như sau:
{ "_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"}]}]}
Hy vọng rằng phần trên sẽ nâng cao hiểu biết của bạn về cách cập nhật tài liệu nhúng hoạt động với Mongo bằng trình điều khiển Java. Tôi nhận thấy rằng câu hỏi này cũng liên quan đến Spring ("mongoOperations" là một lớp từ gói Spring), rất tiếc là tôi không quen thuộc. Nếu bạn vẫn gặp sự cố với bản cập nhật của mình, có lẽ một thành viên khác của Cộng đồng quen thuộc hơn với Spring sẽ có thể hỗ trợ.