sql >> Database teknologi >  >> NoSQL >> MongoDB

$push med positional ($) i upsert mislykkes

Upsert virker ikke i indlejrede dokumenter i opdateringsforespørgsel,

Du kan prøve en kompleks opdatering med en aggregeringsforespørgsel til at håndtere dine sager, hvis du vil gøre det i en enkelt forespørgsel,

Lad os tage et eksempel på input og se eksempler på case-wise,

Case 1: Hvis angivet messages.from feltet findes i messages array

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

Legeplads

Case 2: Hvis messages.from felt findes ikke i array

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

Legeplads

Case 3: Hvis dokumentet ikke findes

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

Legeplads

Din sidste forespørgsel ville være,

  • marker kun to tilstand i forespørgslen
  • opdater del, tjek tilstanden,
    • hvis from findes i messages array derefter:
      • $map at gentage loop af messages array og kontroller tilstanden hvis from fundet og derefter sammenknytte aktuelle subMessages array med ny input subMessage ved hjælp af $concatArrays , $mergeObjects for at flette nuværende objekt med opdateret objekt
    • andet fra ikke fundet, så sammensæt nyt meddelelsesobjekt-array i aktuelle messages array ved hjælp af $cocnatArrays
  • upsert: true , for at indsætte nyt dokument, hvis det ikke findes i samlingen
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. Mongo aggregeringsramme, sorter og derefter gruppe fungerer ikke

  2. MongoDB C# Driver 2.0 - Opdater dokument

  3. Brug $gte og <e mongo-operatoren, hvis dato er i strengformat i mongodb

  4. CosmosDb Request rate er stor med insertMany