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

$ push với positional ($) trong những lần thất bại upert

Nâng cấp sẽ không hoạt động trong các tài liệu lồng nhau trong truy vấn cập nhật,

Bạn có thể thử cập nhật phức tạp với truy vấn tổng hợp để xử lý các trường hợp của mình nếu bạn muốn thực hiện nó trong một truy vấn duy nhất,

Hãy lấy ví dụ đầu vào và xem ví dụ về trường hợp khôn ngoan,

Trường hợp 1: Nếu được chỉ định messages.from trường tồn tại trong messages mảng

var to = "111";
var from = "222";
var subMessage = {
  message: "test",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

Sân chơi

Trường hợp 2: Nếu messages.from trường không tồn tại trong mảng

var to = "111";
var from = "333";
var subMessage = {
  message: "test2",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

Sân chơi

Trường hợp 3: Nếu tài liệu không tồn tại

var to = "111";
var from = "333";
var subMessage = {
  message: "test2",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

Sân chơi

Truy vấn cuối cùng của bạn sẽ là,

  • chỉ kiểm tra to điều kiện trong truy vấn
  • cập nhật một phần, kiểm tra tình trạng,
    • if from được tìm thấy trong messages sau đó mảng:
      • $map để lặp lại vòng lặp của messages mảng và kiểm tra điều kiện nếu from tìm thấy rồi nối subMessages hiện tại mảng với đầu vào mới subMessage sử dụng $concatArrays , $mergeObjects để hợp nhất đối tượng hiện tại với đối tượng đã cập nhật
    • khác từ không tìm thấy sau đó nối mảng đối tượng thư mới trong messages hiện tại mảng sử dụng $cocnatArrays
  • upsert: true , để chèn tài liệu mới nếu không tìm thấy trong bộ sưu tập
db.pendingMessages.updateOne(
  { to: to },
  [{
    $set: {
      messages: {
        $cond: [
          { $in: [from, { $ifNull: ["$messages.from", []] }] },
          {
            $map: {
              input: "$messages",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    subMessages: {
                      $cond: [
                        { $eq: ["$$this.from", from] },
                        {
                          $concatArrays: ["$$this.subMessages", [subMessage]]
                        },
                        "$$this.subMessages"
                      ]
                    }
                  }
                ]
              }
            }
          },
          {
            $concatArrays: [
              { $ifNull: ["$messages", []] },
              [
                {
                  from: from,
                  subMessages: [subMessage]
                }
              ]
            ]
          }
        ]
      }
    }
  }],
  { upsert: true }
)



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongoose findOne function return undefine

  2. Nhận giá trị tối thiểu và giá trị tối đa trong một truy vấn duy nhất trong mongodb

  3. Làm cách nào để lưu trữ thời gian trong ngày trong MongoDB? Như một chuỗi? Cho năm / tháng / ngày tùy ý?

  4. Làm cách nào để deserialize tài liệu json thu được từ mongoDB thành POJO? ... (Di chuyển từ Morphia sang Java Mongo Driver 3.0)

  5. Làm cách nào để đổi tên (các) trường bí danh trong khi tìm nạp nó từ MongoDB thông qua truy vấn sử dụng ổ đĩa gốc MongoDB-Node.JS?