sql >> Database >  >> NoSQL >> MongoDB

$push met positioneel ($) in upsert mislukt

Upsert werkt niet in geneste documenten in updatequery,

U kunt een complexe update proberen met een aggregatiequery om uw zaken af ​​te handelen als u dit in één query wilt doen,

Laten we een voorbeeldinvoer nemen en een voorbeeld per geval bekijken,

Geval 1: Indien gespecificeerd messages.from veld bestaat in messages reeks

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

Speeltuin

Geval 2: Als messages.from veld bestaat niet in array

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

Speeltuin

Geval 3: Als document niet bestaat

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

Speeltuin

Uw laatste vraag zou zijn:

  • vink alleen to aan voorwaarde in zoekopdracht
  • deel updaten, controleer de staat,
    • if from gevonden in messages array dan:
      • $map herhaling van messages array en controleer de voorwaarde als from gevonden en concat huidige subMessages array met nieuwe invoer subMessage met behulp van $concatArrays , $mergeObjects om het huidige object samen te voegen met het bijgewerkte object
    • anders van niet gevonden dan concat nieuwe berichtobjectarray in huidige messages array met behulp van $cocnatArrays
  • upsert: true , om een ​​nieuw document in te voegen als het niet in de verzameling staat
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. MongoDB® met Hadoop en gerelateerde Big Data-technologieën

  2. mangoest:retourneer alleen sleutels van een document

  3. Er is een manier om referentiële integriteit af te dwingen in MongoDB

  4. Node.js en Mongoose regex-query op meerdere velden