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

perbarui objek bersarang dua lapisan berdasarkan id

Anda sebenarnya dapat menyelesaikan masalah Anda dengan pembaruan metode, tetapi Anda harus melakukannya dengan cara yang berbeda jika Anda menggunakan MongoDB 4.2 atau yang lebih baru. Parameter kedua dapat berupa $set operasi yang ingin Anda lakukan atau aggregation pipa. Menggunakan nanti Anda memiliki lebih banyak kebebasan membentuk data. Ini adalah cara Anda dapat menyelesaikan masalah Anda, saya akan menguraikannya setelah:

db.collection.update({
  "cards.advanced.unit": 2
},
[
  {
    $set: {
      "cards.advanced": {
        $map: {
          input: "$cards.advanced",
          as: "adv",
          in: {
            cards: {
              $map: {
                input: "$$adv.cards",
                as: "advcard",
                in: {
                  $cond: [
                    {
                      $eq: [
                        "$$advcard.id",
                        "main-2-1"
                      ]
                    },
                    {
                      title: "this is a NEW updated card",
                      id: "$$advcard.id"
                    },
                    "$$advcard"
                  ]
                }
              }
            },
            unit: "$$adv.unit"
          }
        }
      }
    }
  }
],
{
  new: true,
  
});

Pertama dengan menggunakan update metode melewati tiga parameter:

  • Filter kueri
  • Jalur agregasi
  • Opsi. Di sini saya hanya menggunakan new: true untuk mengembalikan dokumen yang diperbarui dan membuatnya lebih mudah untuk diuji.

Ini strukturnya:

db.collection.update({
  "cards.advanced.unit": 2
},
[
  // Pipeline
],
{
  new: true,
});

Di dalam pipeline kita hanya membutuhkan satu stage, $set untuk mengganti properti advanced dengan array yang akan kita buat.

...
[
  {
    $set: {
      "cards.advanced": {
        // Our first map
      } 
    }
  }
]
...

Kami pertama memetakan advanced array untuk dapat memetakan array kartu bersarang setelah:

...
[
  {
    $set: {
      "cards.advanced": {
        $map: {
          input: "$cards.advanced",
          as: "adv",
          in: {
            // Here we will map the nested array
          }
        }     
      } 
    }
  }
]
...

Kami menggunakan variabel yang kami deklarasikan pada peta pertama dan yang berisi item larik lanjutan saat ini yang sedang dipetakan ( adv ) untuk mengakses dan memetakan larik "kartu" bersarang ( $$adv.cards ):

...
[
  {
    $set: {
      "cards.advanced": {
        $map: {
          input: "$cards.advanced",
          as: "adv",
          in: {
            cards: {
              $map: {
                input: "$$adv.cards",
                as: "advcard",
                in: {
                // We place our condition to check for the chosen card here
                }
              }
            },
            unit: "$$adv.unit",
          }
        }     
      } 
    }
  }
]
...

Terakhir kita periksa apakah id kartu saat ini sama dengan id yang dicari $eq: [ "$$advcard.id", "main-2-1" ] dan kembalikan kartu baru jika cocok atau kartu saat ini:

...
{
  $cond: [
    {
      $eq: [
        "$$advcard.id",
        "main-2-1"
      ]
    },
    {
      title: "this is a NEW updated card",
      id: "$$advcard"
    },
    "$$advcard"
  ]
}

...

Berikut adalah contoh kerja dari apa yang dijelaskan:https://mongoplayground.net/p/xivZGNeD8ng




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Apa saja kasus penggunaan nyata untuk menggunakan db Toko Dokumen NoSQL?

  2. MongoDB $setUnion

  3. Obrolan Waktu Nyata Dengan Modulus dan Node.js

  4. Pencarian Teks MongoDB DAN beberapa kata pencarian

  5. MongoDB, tambahkan { field :value } baru di dokumen tersemat yang ada dengan notasi titik multi level?