Saya memiliki dokumen mongo dan ketika pesanan baru muncul, saya perlu mendorongnya atau memperbarui (menambah kuantitas) jika pesanan part_id sudah ada.

   {
       user_id: '13',     
       stock: [
         {
           part_id: 'P456',
           quantity: 3
         },
         {
           part_id: 'P905',
           quantity: 8
         }
       ]
    }

Saya telah mencoba menggunakan {upsert: true} dan $inc tetapi tidak dapat menemukan solusinya.

1
TKX 11 Mei 2021, 16:43

1 menjawab

Jawaban Terbaik

Saya telah mencoba menggunakan {upsert: true} dan $inc tetapi tidak dapat menemukan solusinya

Upsert tidak akan mendukung dalam array objek, Anda dapat mencoba 2 pertanyaan pencarian pertama dan pembaruan kedua,

Hitung dokumen menggunakan countDocuments:

let user_id = "13";
let part_id = "P456";
let hasDoc = await YourSchema.countDocuments({ user_id: user_id, "stock.part_id": part_id });
  • Periksa kondisi jika ada dokumen kemudian tambahkan kuantitas satu per satu
  • Barang dorong lain dalam stok
// Document already exists, so increment it value
if (hasDoc > 0) {
  await YourSchema.updateOne(
    { user_id: user_id, "stock.part_id": part_id },
    { $inc: { "stock.$.quantity": 1 } }
  );
} 

// Document not exists then add document
else {
  await YourSchema.updateOne(
    { user_id: user_id },
    { $push: { stock: { part_id: part_id, quantity: 1 } } }
  );
}

Opsi Kedua: Anda dapat memperbarui dengan pipa agregasi mulai dari MongoDB 4.2,

  • $cond untuk memeriksa apakah part_id tersedia
    • ya, $map untuk mengulangi loop stock dan periksa kondisi jika part_id cocok lalu tambahkan 1 di quantity jika tidak kembalikan objek saat ini
    • tidak, tambahkan objek baru dengan part_id dan kuantitas dalam stock menggunakan $concatArrays
let user_id = "13";
let part_id = "P456";
db.collection.update(
  { user_id: user_id },
  [{
    $set: {
      stock: {
        $cond: [
          { $in: [part_id, "$stock.part_id"] },
          {
            $map: {
              input: "$stock",
              in: {
                $cond: [
                  { $eq: ["$$this.part_id", part_id] },
                  {
                    part_id: "$$this.part_id",
                    quantity: { $add: ["$$this.quantity", 1] }
                  },
                  "$$this"
                ]
              }
            }
          },
          { $concatArrays: ["$stock", [{ part_id: part_id, quantity: 1 }]] }
        ]
      }
    }
  }]
)

Tempat bermain

1
turivishal 11 Mei 2021, 17:55