sql >> Databáze >  >> NoSQL >> MongoDB

$push s pozičním ($) v upsert selže

Upsert nebude fungovat ve vnořených dokumentech v aktualizačním dotazu,

Můžete zkusit složitou aktualizaci s agregačním dotazem pro zpracování vašich případů, pokud to chcete udělat v jediném dotazu,

Vezměme si příklad vstupu a podívejme se na příklad,

Případ 1: Pokud je zadáno messages.from pole existuje ve messages pole

var to = "111";
var from = "222";
var subMessage = {
  message: "test",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

Hřiště

Případ 2: Pokud messages.from pole v poli neexistuje

var to = "111";
var from = "333";
var subMessage = {
  message: "test2",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

Hřiště

Případ 3: Pokud dokument neexistuje

var to = "111";
var from = "333";
var subMessage = {
  message: "test2",
  date: ISODate("2021-06-29T15:57:53.975Z")
};

Hřiště

Váš poslední dotaz by byl,

  • zaškrtněte pouze to podmínka v dotazu
  • aktualizovat část, zkontrolovat stav,
    • pokud from naleznete ve messages pole pak:
      • $map iterovat smyčku messages pole a zkontrolujte podmínku, pokud from nalezen a poté concat aktuální subMessages pole s novým vstupem subMessage pomocí $concatArrays , $mergeObjects ke sloučení aktuálního objektu s aktualizovaným objektem
    • jinak z nenalezeno, pak spojte nové pole objektů zprávy v aktuálních messages pole pomocí $cocnatArrays
  • upsert: true , vložit nový dokument, pokud nebyl nalezen ve sbírce
db.pendingMessages.updateOne(
  { to: to },
  [{
    $set: {
      messages: {
        $cond: [
          { $in: [from, { $ifNull: ["$messages.from", []] }] },
          {
            $map: {
              input: "$messages",
              in: {
                $mergeObjects: [
                  "$$this",
                  {
                    subMessages: {
                      $cond: [
                        { $eq: ["$$this.from", from] },
                        {
                          $concatArrays: ["$$this.subMessages", [subMessage]]
                        },
                        "$$this.subMessages"
                      ]
                    }
                  }
                ]
              }
            }
          },
          {
            $concatArrays: [
              { $ifNull: ["$messages", []] },
              [
                {
                  from: from,
                  subMessages: [subMessage]
                }
              ]
            ]
          }
        ]
      }
    }
  }],
  { upsert: true }
)



  1. Jak nakonfigurovat zdroj dat StrongLoop LoopBack MongoDB pro nasazení do Heroku

  2. Problém s používáním MongoDB jako backendu pro projekt Django (Django 1.7)

  3. Vytvoření vlastního ID objektu v MongoDB

  4. Dotaz na dokumenty, které mají vnitřní podpole dané hodnoty