#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. Я верю, что будет другой способ достичь этого. Заранее благодарю вас за потраченное время.