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

Cập nhật Mảng nơi nó tồn tại hoặc Chèn Mục Mảng mới

Bạn muốn .bulkWrite() cho điều này. Đây thực sự không phải là một thao tác đơn lẻ, vì vậy bạn muốn gửi nhiều thao tác trong một yêu cầu duy nhất. Về cơ bản, hãy cố gắng viết bản cập nhật bằng $set nơi dữ liệu tồn tại hoặc $push dữ liệu mới không tồn tại:

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": "10" },
    "update": { 
      "$set": { "option.$.price": "30" }
    }
  }},
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
    "update": {
      "$push": { "option": { "weight": "10", "price": "30" } }
    }
  }}
])

Trường hợp khẳng định chỉ đơn giản là giá trị và $ne "phủ định" đối sánh bình đẳng, có nghĩa là mục không tồn tại. Tất nhiên, vị trí $ nhà điều hành được sử dụng với $set nó ở đâu

Với dữ liệu, chỉ một trong các hoạt động sẽ thực sự khớp và áp dụng như một bản cập nhật mặc dù hai hoạt động được gửi trong "lô".

Nếu bạn cũng muốn "uperts" cho toàn bộ tài liệu, thì bạn cần thêm một thao tác khác vào cuối thao tác đó. Lưu ý rằng bạn không thể áp dụng "upert" làm tùy chọn cho một trong các câu lệnh khác, đặc biệt là $ne bởi vì điều đó sẽ tạo ra một tài liệu mới trong đó mục mảng không tồn tại, không chỉ _id :

db.collection.bulkWrite([
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": "10" },
    "update": { 
      "$set": { "option.$.price": "30" }
    }
  }},
  { "updateOne": {
    "filter": { "_id": "1", "option.weight": { "$ne": "10" } },
    "update": {
      "$push": { "option": { "weight": "10", "price": "30" } }
    }
  }},
  { "updateOne": {
    "filter": { "_id": 1 },
    "update": {
      "$setOnInsert": {
        "option": [
           { "weight": "10", "price": "30" }
         ]
      }
    },
    "upsert": true
  }}
])

$setOnInsert là trợ giúp chính ở đây ngoài thao tác cuối cùng được đánh dấu duy nhất là "upsert" . Sự kết hợp đó đảm bảo rằng nơi tìm thấy "tài liệu" chính thì không có gì thực sự xảy ra, nhưng khi không tìm thấy, mục mảng mới sẽ được thêm vào.

Lưu ý thêm, tôi thực sự khuyên bạn nên lưu trữ các giá trị số thực sự dưới dạng số thay vì chuỗi. Nó không chỉ tiết kiệm dung lượng trong hầu hết các trường hợp mà còn hữu ích hơn nhiều theo cách đó.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để phân trang bằng cách sử dụng truy vấn phạm vi trong MongoDB?

  2. mongo $ Slice truy vấn đảo ngược chỉ mục ngoài phạm vi

  3. Làm thế nào để giải quyết TypeError:callback.apply không phải là một hàm?

  4. Khớp với một trường mảng có chứa bất kỳ kết hợp nào của mảng được cung cấp trong MongoDB

  5. Không thể chứa bất kỳ thao tác nào với khóa Mongodb. hoặc $?