Добавление поля из объекта в массиве в другое поле объекта в том же массиве MongoDB - PullRequest
1 голос
/ 05 августа 2020

Мне очень нужна помощь с обновлением документа в MongoDB.

Итак, вот моя проблема. Мне нужно удалить объект внутри массива записей, имеющий тип OLD, однако перед его удалением мне нужно будет добавить его значение к объекту с типом CURRENT. Итак, приведенный ниже пример. Запрос должен изменить значение объекта CURRENT на 120, и объект типа OLD будет удален;

Я не могу сделать два запроса, так как этот запрос будет обновлять тысячи данных.

Это в node.js с использованием mon goose.

Заранее спасибо!

{
    name: 'Test',
    records: [
        {
            type: 'NEW',
            value: 50,
        },
        {
            type: 'OLD',
            value: 100,
        },
        {
            type: 'CURRENT',
            value: 20
        } 
    ]
}

1 Ответ

0 голосов
/ 17 августа 2020

Вы можете сделать это, используя обновление с конвейером агрегации из MongoDB v4.2,

  • первый тип соответствия с CURRENT
  • первый $set для суммирования значения типа CURRENT и типа OLD
  • второй $set для удаления типа OLD
db.collection.updateMany(
  { "records.type": "CURRENT" },
  [{
    $set: {
      records: {
        $map: {
          input: "$records",
          as: "r",
          in: {
            $cond: {
              if: { $eq: ["$$r.type", "CURRENT"] },
              then: {
                type: "$$r.type",
                value: {
                  $add: [
                    "$$r.value",
                    {
                      $reduce: {
                        input: "$records",
                        initialValue: 0,
                        in: {
                          $cond: {
                            if: { $eq: ["$$this.type", "OLD" ] },
                            then: { $add: ["$$this.value", "$$value"] },
                            else: "$$value"
                          }
                        }
                      }
                    }
                  ]
                }
              },
              else: "$$r"
            }
          }
        }
      }
    }
  },
  {
    $set: {
      records: {
        $filter: {
          input: "$records",
          as: "r",
          cond: { $ne: ["$$r.type", "OLD"] }
        }
      }
    }
  }
])
...