MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

$push с позиционен ($) в upsert е неуспешен

Upsert няма да работи във вложени документи в заявка за актуализиране,

Можете да опитате сложна актуализация със заявка за обобщаване, за да обработите вашите случаи, ако искате да го направите в една заявка,

Нека да вземем пример за въвеждане и да видим примерни малки и големи букви,

Случай 1: Ако е посочено messages.from полето съществува в messages масив

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

Playground

Случай 2: Ако messages.from полето не съществува в масив

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

Playground

Случай 3: Ако документът не съществува

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

Playground

Последното ви запитване ще бъде,

  • проверете само to условие в заявката
  • актуализирайте частта, проверете състоянието,
    • ако from намерени в messages масив след това:
      • $map за итериране на цикъл от messages масив и проверете условието, ако from намери след това свържете текущите subMessages масив с нов вход subMessage използвайки $concatArrays , $mergeObjects за обединяване на текущия обект с актуализирания обект
    • друго от не е намерено, след това свържете нов обектен масив от съобщения в текущите messages масив с помощта на $cocnatArrays
  • upsert: true , за вмъкване на нов документ, ако не е намерен в колекцията
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. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. mongod shell не стартира, data/db не съществува

  2. няма достъп до свойствата на req.user

  3. Mongodb find() заявка:връща само уникални стойности (без дубликати)

  4. Синхронизиране на сървърни данни на MongoDB към локално хранилище на IndexedDB

  5. Как да заявя MongoDB с like