Toán tử vị trí không hoạt động trên số cấp bạn đang cố gắng để nó hoạt động ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. Issuetabpanels% 3Acomment-tabpanel
) với các menu menus.$.items.$.name
và ngay cả khi nó xảy ra, trình phân tích cú pháp truy vấn MongoDB sẽ không biết $
kia là gì là từ find
của update
.
Bạn sẽ cần lấy các mục khỏi lược đồ, cập nhật riêng và sau đó cập nhật tài liệu gốc.
Một cách tốt để đánh giá khi nào các truy vấn nên được thực hiện riêng biệt là nghĩ rằng mỗi menu giống như một thực thể riêng biệt (hoặc bảng trong cơ sở dữ liệu quan hệ), vì vậy, bạn có thể nên làm việc cập nhật các phần mềm đó (hoặc bảng trong mô hình quan hệ) riêng biệt để thực thể mẹ (bảng).
Vì vậy, trước tiên bạn sẽ lấy ra tài liệu gốc chính. Cuộn qua các menu của nó ở phía máy khách rồi đến $set
menu cụ thể đó cho toàn bộ mục bạn xây dựng ở phía khách hàng.
Chỉnh sửa
Cách tôi tưởng tượng phía máy khách công việc này (bằng mã giả vì Java của tôi hơi cũ) bằng cách đầu tiên lấy tài liệu đó theo kiểu bản ghi hoạt động:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
Sau đó, bạn sẽ lặp lại tài liệu chỉ định các giá trị của mình:
foreach(doc.menus as menu_key => menu){
foreach(menu['items'] as key => item){
if(item._id == { "$oid" : "506e9f07a4e8f5142367942f"}){
doc.menus[menu_key][key][name] = "xcvxc66666"
}
}
}
Và sau đó, đơn giản lưu tài liệu sau khi tất cả các thay đổi được cam kết:
db.col.save(doc);
Tất nhiên đây chỉ là một cách thực hiện và cách này sử dụng mô hình bản ghi activen mà cá nhân tôi thích. Trong ý tưởng này, bạn sẽ kết hợp tìm thấy với mọi thứ khác mà bạn cần sửa đổi trên tài liệu, xây dựng nó ở phía máy khách và sau đó gửi tất cả xuống dưới dạng một truy vấn duy nhất tới DB của bạn.