Możesz rozwiązać swój problem za pomocą aktualizacji metody, ale musisz to zrobić w inny sposób, jeśli używasz MongoDB 4.2 lub nowszego. Drugim parametrem może być $set
operacja, którą chcesz wykonać lub aggregation
rurociąg. Używając później masz większą swobodę w kształtowaniu danych. W ten sposób możesz rozwiązać swój problem, podzielę się po:
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,
});
Najpierw użyj aktualizacji metoda przekazująca trzy parametry:
- Filtruj zapytanie
- Potok agregacji
- Opcje. Tutaj właśnie użyłem
new: true
aby zwrócić zaktualizowany dokument i ułatwić testowanie.
Oto struktura:
db.collection.update({
"cards.advanced.unit": 2
},
[
// Pipeline
],
{
new: true,
});
Wewnątrz potoku potrzebujemy tylko jednego etapu, $set
zastąpić właściwość advanced
z tablicą, którą utworzymy.
...
[
{
$set: {
"cards.advanced": {
// Our first map
}
}
}
]
...
Najpierw mapujemy advanced
tablica, aby móc mapować zagnieżdżoną tablicę kart po:
...
[
{
$set: {
"cards.advanced": {
$map: {
input: "$cards.advanced",
as: "adv",
in: {
// Here we will map the nested array
}
}
}
}
}
]
...
Używamy zmiennej, którą zadeklarowaliśmy na pierwszej mapie i która zawiera zaawansowaną tablicę, aktualnie mapowany element ( adv
), aby uzyskać dostęp i mapować zagnieżdżoną tablicę „kart” ( $$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",
}
}
}
}
}
]
...
Na koniec sprawdzamy, czy bieżący identyfikator karty jest równy identyfikatorowi przeszukiwanego $eq: [ "$$advcard.id", "main-2-1" ]
i zwróć nową kartę, jeśli pasuje, lub obecną kartę:
...
{
$cond: [
{
$eq: [
"$$advcard.id",
"main-2-1"
]
},
{
title: "this is a NEW updated card",
id: "$$advcard"
},
"$$advcard"
]
}
...
Oto działający przykład tego, co zostało opisane:https://mongoplayground.net/p/xivZGNeD8ng