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

Cập nhật các mảng lồng nhau trong mongodb

Đây là một câu hỏi lớn, bạn có cần tận dụng các hoạt động "addToSet" và "push" của Mongo không? Nếu bạn thực sự định chỉ sửa đổi các mục riêng lẻ trong mảng, thì bạn có thể nên xây dựng các mảng này dưới dạng đối tượng.

Đây là cách tôi sẽ cấu trúc nó:

{
    id: 1,
    items: 
        { 
          "2" : { "blocks" : { "3" : { txt : 'hello' } } },
          "5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
        }
}

Về cơ bản, điều này chuyển đổi mọi thứ thành các đối tượng JSON thay vì mảng. Bạn mất khả năng sử dụng $push$addToSet nhưng tôi nghĩ điều này làm cho mọi thứ dễ dàng hơn. Ví dụ:truy vấn của bạn sẽ giống như sau:

db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})

Bạn cũng sẽ nhận thấy rằng tôi đã kết xuất "ID". Khi bạn lồng những thứ như thế này, bạn thường có thể thay thế "ID" bằng cách chỉ sử dụng số đó làm chỉ mục. Khái niệm "ID" hiện đã được ngụ ý.

Tính năng này đã được thêm vào trong phiên bản 3.6 với các bản cập nhật nhanh chóng.

db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để chèn một tài liệu vào mongodb bằng cách sử dụng mongoose và lấy id đã tạo?

  2. Sử dụng UUID thay vì ObjectID trong MongoDB

  3. Lưu trữ luồng dữ liệu từ yêu cầu POST trong GridFS, express, mongoDB, node.js

  4. Cách xóa một trường khỏi tài liệu MongoDB ($ unset)

  5. Phân trang theo phạm vi MongoDB