2011-07-23 37 views
20

Tôi đang sử dụng MongoDB với trình điều khiển Java chính thức (phiên bản 2.6.3). Tôi có một bộ sưu tập MongoDB chứa danh sách mua sắm. Một danh sách mua sắm có định dạngCập nhật mảng trong MongoDB bằng trình điều khiển Java

{ "_id" : { "$oid" : "4e2af1f43f8de96494d5271d"} , 
    "name" : "default" , 
    "items" : [ { "description" : "Cheese" , "quantity" : 1 , "unit" : "kg"} , 
       { "description" : "Water" , "quantity" : 3 , "unit" : "bottle"} ] } 

Bây giờ tôi muốn thêm một mục mới vào danh sách với các phương pháp update() của DBCollection. Nhưng bất cứ điều gì tôi cố gắng nó sẽ không hoạt động mặc dù nó nói với tôi

{ "updatedExisting" : true , "n" : 1 , "connectionId" : 63 , "err" : null , "ok" : 1.0} 

Mã của tôi không như sau:

BasicDBObject updateQuery = new BasicDBObject(); 
    updateQuery.put("name", "default"); 

    BasicDBObject updateCommand = new BasicDBObject(); 
    updateCommand.put("$push", new BasicDBObject("items", newShoppingItem)); 
    WriteResult result = shoppingLists.update(updateQuery, updateCommand, true, true); 

newShoppingItem là một BasicDBObject chứa các dữ liệu cho các mục mới. Tôi cũng đã cố tạo các thông số update() với BasicDBObjectBuilderJSON.parse() nhưng không có sự khác biệt.

Tôi cũng đã xem xét các bài đăng khác, đã thử googleing nhưng không có kết quả. Tôi đang làm gì sai?

Cảm ơn bạn đã trợ giúp!
Oliver

+0

Tôi đã chạy mã chính xác đó với trình điều khiển MongoDB 2.5.3 và nó hoạt động tốt. Đảm bảo bạn đang tìm kiếm đúng DB. –

+0

Điều này hữu ích đối với tôi như một cách hiểu rõ hơn về cú pháp hơi mơ hồ trong trình điều khiển Java cho Mongo. Cảm ơn! – jsh

Trả lời

10

có, mã ở trên hoạt động hoàn toàn tốt. Bây giờ tôi biết lỗi của tôi ở đâu. Tôi muốn làm điều đó chống đạn, vì vậy tôi nghĩ rằng nó sẽ là tốt nhất để sử dụng tiết kiệm() trên DBCollection ở cuối và dứt khoát lưu danh sách mua sắm DBObject:

shoppingLists.save(shoppingList); 

bây giờ tôi đọc trong một số diễn đàn khác các đối tượng bạn truy xuất từ ​​cơ sở dữ liệu sau đó không được đồng bộ hóa với cơ sở dữ liệu sau đó (âm thanh loại hợp lý với tôi bây giờ :)). Vì vậy, tôi ghi đè lên những thay đổi bản thân mình mọi lúc. Sau khi xóa dòng bên trên nó hoạt động :)

Vì vậy, một quy tắc quan trọng: Khi bạn cập nhật DBCollection - điều này sẽ được gửi trực tiếp đến cơ sở dữ liệu! - không lưu DBObject mà bạn truy vấn trước khi cập nhật! Nó sẽ ghi đè lên cập nhật của bạn!

Các vấn đề liên quan