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