MongoDB
 sql >> Teknologi Basis Data >  >> NoSQL >> MongoDB

$push dengan posisi ($) di upsert gagal

Upsert tidak akan berfungsi dalam dokumen bersarang dalam kueri pembaruan,

Anda dapat mencoba pembaruan kompleks dengan kueri agregasi untuk menangani kasus Anda jika Anda ingin melakukannya dalam satu kueri,

Mari kita ambil contoh masukan dan lihat contoh kasusnya,

Kasus 1: Jika ditentukan messages.from kolom ada di messages larik

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

Taman bermain

Kasus 2: Jika messages.from bidang tidak ada dalam larik

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

Taman bermain

Kasus 3: Jika dokumen tidak ada

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

Taman bermain

Permintaan terakhir Anda adalah,

  • hanya centang to kondisi dalam kueri
  • perbarui bagian, periksa kondisinya,
    • jika from ditemukan di messages array maka:
      • $map untuk mengulangi loop messages array dan periksa kondisi jika from ditemukan kemudian gabungkan subMessages saat ini array dengan input baru subMessage menggunakan $concatArrays , $mergeObjects untuk menggabungkan objek saat ini dengan objek yang diperbarui
    • lain dari tidak ditemukan kemudian gabungkan array objek pesan baru dalam messages saat ini array menggunakan $cocnatArrays
  • upsert: true , untuk menyisipkan dokumen baru jika tidak ditemukan dalam koleksi
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. MongoClient tidak bekerja dengan php

  2. Morphia MongoDB memeriksa bidang nol dan tidak ada

  3. Masukkan Async Massal (batch) ke MySQL (atau MongoDB?) melalui Node.js

  4. MongoDB memproyeksikan dokumen dengan jumlah lebih dari 2

  5. Bagaimana Anda menemukan dengan id menggunakan driver MongoDB Node?