MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

zaktualizować dwuwarstwowy obiekt zagnieżdżony na podstawie identyfikatora

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




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak czekać na wypchnięcie pozycji z listy mangusty?

  2. Znajdź i zamień ciągi w efektywny sposób

  3. Wydajne stronicowanie w MongoDB przy użyciu mgo.v2 i MongoDB> 4.2

  4. Spring Data MongoDB - ignoruj ​​puste obiekty

  5. Ustaw limity kolekcji mongo db