Обновите поле массива документов на «$push», указав количество элементов, равное значению других полей в том же документе атомарно

#node.js #mongodb #mongoose

Вопрос:

Моя структура документа выглядит следующим образом:-

 { _id : "60ffa03fe124375b21cf5bf1",
  nextLength : 4,
  arr : [0,0,0,0,0,0]
}
 

nextLength Поле представляет собой количество элементов, которые должны быть перемещены в arr поле рядом $push с arr полем. И каждый раз arr , когда поле будет сдвинуто nextLenght , поле будет проходить $inc мимо 1 . Поэтому поле рядом $push с arr полем должно вводить 4 0 в arr поле и nextLength должно увеличиваться до 5.

Ожидаемый результат после обновления

 { _id : "60ffa03fe124375b21cf5bf1",
  nextLength : 5,
  arr : [0,0,0,0,0,0,0,0,0,0] }
 

Почему он должен быть атомным

Этот документ будет часто обновляться, и операции чтения и обновления должны выполняться одновременно и с использованием одного запроса, потому что каждый раз, когда выполняется обновление, я сохраняю значение следующей длины старого документа в другой коллекции.

Моя работа до сих пор использует конвейер агрегации mongodb.

 const resultBeforeUpdate= await TestModel.collection.findOneAndUpdate(
    {
      _id: "60ffa03fe124375b21cf5bf1",
    },
    [
      {
        $set: {
          arr: {
            $concatArrays: [
              "$arr",
              {
                $function: {
                  body: function (nextLenght) {
                    return new Array(nextLength).fill(0);
                  },
                  args: ["$this.nextLength"],
                  lang: "js",
                },
              },
            ],
          },
        },
      },
      {
        $set: {
          nextLength: {
            $function: {
              body: function (previousLength) {
                return previousLength   1;
              },
              args: ["$this.nextLenght"],
              lang: "js",
            },
          },
        },
      },
    ],
    { new: false,}
  );
 

My code failed with following error

 uncaught exception: Error: findAndModifyFailed failed: {
        "ok" : 0,
        "errmsg" : "Invalid $set :: caused by :: Use of undefined variable: this",
        "code" : 17276,
        "codeName" : "Location17276"
}
 

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