MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Làm thế nào để xây dựng truy vấn để cập nhật tài liệu mảng lồng nhau trong mongo?

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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoose cập nhật một trường trong MongoDB không hoạt động

  2. mongo .find trả lại trường cụ thể chỉ cho tất cả người dùng

  3. Trong Morphia, làm cách nào để cập nhật một Đối tượng được nhúng bên trong ArrayList

  4. NestJS:Cách triển khai xác thực người dùng dựa trên phiên

  5. Mongoimport được cài đặt ở đâu trên Mac OS X