#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]
Каков правильный способ добиться этого?
РЕДАКТИРОВАТЬ: это упрощение реальной проблемы. В реальной проблеме я читаю документ, на основе его содержимого я выполняю некоторые операции (проверяю, возможно, выдаю ошибку …), А затем сохраняю. В этом случае я думаю, что использовать 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);
});