Memasukkan data ke array bersarang di mongodb
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
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" }
]
})
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 $ [].
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
})