Memasukkan data ke array bersarang di mongodb

Sep 28 2020

Saya memiliki dokumen yang terlihat seperti ini

{
 _id:1,
 list_id:23,
 name:'list01'
 cards:[
  {
   id:3,
   name:'card01'
   categories:[{
    id:10,
    category:'section01',
    tags:[{id:11,name:'tag01',is_selected: true}]
  }] 
  }
 ]
}

Saya perlu memasukkan / mendorong beberapa data ke larik tag dalam kategori yang dipilih untuk list_id tertentu tetapi saya mendapatkan kesalahan yang mengatakan

MongoError: Terlalu banyak posisi (yaitu '$') elements found in path 'cards.$.categories. $. tags '

Ini adalah pertanyaan yang telah saya coba. Apa yang salah dengan pertanyaan ini, ada gagasan tentang cara mencapai ini?

db.collection(TABLE)
    .updateOne(
      { list_id: 23, 'cards.categories.category': 'section01'},
      { $push: { 'cards.$.categories.$.tags': { name: 'tag02', id: uuidv4(), is_selected: true } } }
    );

Jawaban

1 turivishal Sep 28 2020 at 14:06

Anda tidak dapat menggunakan beberapa $ posisi, untuk kasus Anda, Anda dapat menggunakan posisi tunggal dan https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/,

Operator posisi yang difilter $[<identifier>]mengidentifikasi elemen array yang cocok dengan kondisi arrayFilters untuk operasi pembaruan,

db.collection(TABLE).updateOne({
  list_id: 23,
  "cards.categories.category": "section01"
},
{
  $push: {
    "cards.$.categories.$[elem].tags": {
      name: "tag02",
      id: uuidv4(),
      is_selected: true
    }
  }
},
{
  arrayFilters: [
    { "elem.category": "section01" }
  ]
})

https://mongoplayground.net/p/tZqU1RX7JOW

1 chakwok Sep 28 2020 at 13:59

Singkatnya, itu tidak mungkin.

Array Bersarang

Posisional $ operator cannot be used for queries which traverse more than one array, such as queries that traverse arrays nested within other arrays, because the replacement for the $ placeholder adalah nilai tunggal

https://docs.mongodb.com/manual/reference/operator/update/positional/

Namun, Anda mungkin ingin mencoba $ []

Array Bersarang Operator posisi yang difilter $ [] bisa digunakan untuk kueri yang melintasi lebih dari satu larik dan larik bersarang.

Sebagai contoh, lihat Memperbarui Array Bersarang yang Berhubungan dengan $ [].

https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#position-nested-arrays-filtered

1 AlexisG Sep 28 2020 at 14:06

Kamu bisa memakai https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/#position-nested-arrays-filtered

db.collection.update({
  "list_id": 23,
  "cards.categories.category": "section01"
},
{
  $push: {
    "cards.$.categories.$[elem].tags": {
      name: "tag02",
      id: uuidv4(),
      is_selected: true
    }
  }
},
{
  arrayFilters: [
    {
      "elem.category": "section01"
    }
  ],
  multi: true
})

Cobalah https://mongoplayground.net/p/YWOetb3FR8i