Мангуст — чтение и обновление на основе прочитанных данных

#node.js #mongodb #mongoose

#node.js #mongodb #мангуст

Вопрос:

Это модель, которую я использую:

 const TestSchema: Schema = new Schema({
    id: {type: String, required: true, unique: true},
    array: [{ type: Number, required: true }],
}, { timestamps: { createdAt: 'createdAt' }});
 

Мне нужна конечная точка, где этот документ считывается, а затем добавьте новый элемент в свойство «array»; этот новый элемент будет длиной массива. Итак, если я отправлю три запроса на конечную точку, объект массива должен иметь [«0», «1», «2»].

Для достижения этой цели я пытаюсь использовать транзакции, подобные этой:

  const session = await startSession();

            await session.withTransaction(async () => {
                const doc = await Test.findOne({id: "0"});
                if(!doc) { res.status(400).send("Bad request");  return;}

                doc.array.push()
                doc.array.push(doc.array.length);
                
                await doc.save();
    
                res.send(doc);
            });
           
            session.endSession();
 

Чтобы протестировать конечную точку, я использую JMeter, отправляя 10 одновременных запросов, и это результат:

 "array": [0,0,1,1,2,2,3,3,4,4,4,6,10,12,13]
 

Объект MongoDB

Каков правильный способ добиться этого?

РЕДАКТИРОВАТЬ: это упрощение реальной проблемы. В реальной проблеме я читаю документ, на основе его содержимого я выполняю некоторые операции (проверяю, возможно, выдаю ошибку …), А затем сохраняю. В этом случае я думаю, что использовать findOneAndUpdate очень сложно.

Ответ №1:

Проблема заключалась в том, что я не использовал переменную «session» при чтении и записи. Решение:

 const session = await startSession();

            await session.withTransaction(async () => {
                const doc = await Test.findOne({id: "0"}).session(session);;
                if(!doc) { res.status(400).send("Bad request");  return;}

                doc.array.push()
                doc.array.push(doc.array.length);
                
                doc.update()
                await doc.save({session});
    
                res.send(doc);
            });