#mongodb #mongodb-nodejs-driver
Вопрос:
execTransaction(session =gt; { return async () =gt; { await db.collection('table1').updateOne({ username: username }, { $push: { apps: client_id } }, { session }); await db.collection('table2').insertOne({ data: data }, { session }); }; }, data =gt; { console.log(data); //data.result.ok = 1 });
Я использую withTransaction
в nodejs для запуска транзакций.
Когда я правильно выполняю транзакцию, data.result.ok = 1
Но когда я использую не существующий запуск имени пользователя updateOne
, результат остается прежним 1
.
Как проверить результат?
Комментарии:
1. Вы всегда будете получать результат в порядке. Чтобы проверить номер обновленного документа, проверьте свойство «modifiedCount».
2. В возвращаемых данных нет «modifiedCount» и другого полезного свойства. @Дипак Сингх
3. Не обновление документа в коллекции не является сбоем операции (и транзакции). Это означает только то, что запрос выполнен, совпадений не было и, следовательно, обновления не произошло. Вы можете построить свою собственную логику — что, когда обновление не произошло, откат / прерывание транзакции.
Ответ №1:
insertOne
должен вернуть Object
подобное в случае успеха
{ acknowledged: true, insertId: lt;object OjectIdgt; // or the _id you specified }
updateOne
должен вернуть Object
подобное в случае успеха
{ acknowledged: true, modifiedCount: 1, // or 0 if upserted upsertedId: null, // or an lt;object OjectIdgt; upsertedCount: 0, // or 1 if upserted matchedCount: 1 // or 0 if upserted }
Теперь updateOne
обновляется только первый документ, соответствующий запросу. Если ни один документ не соответствует запросу, он просто не обновит документ и не выдаст ошибок. Вы получите такой объект, если это произойдет,
{ acknowledged: true, modifiedCount: 0, upsertedId: null, upsertedCount: 0, matchedCount: 0 }
Таким образом, проверка data.result.ok
ничего не скажет вам в этом сценарии. Вы должны вручную проверять каждый вызов метода, если хотите сделать что-то подобное. В вашем случае, может быть, сделать что-то подобное?
execTransaction(session =gt; { return async () =gt; { await Promise.all([ db.collection('table1').updateOne({ username: username }, { $push: { apps: client_id } }, { session }), db.collection('table2').insertOne({ data: data }, { session }) ]) }; }, data =gt; { if (data[0].matchedCount === 0) { // do error handling ? } } )
Или, если вы хотите знать, все ли операции CRUD прошли успешно, как следует из названия, может быть, это?
(await Promise.all([a list of all insertOne and updateOne operations... ]) .every(obj =gt; obj amp;amp; obj.acknowledged amp;amp; (obj.insertId || obj.modifiedCount || obj.upsertedCount)) // this checks if all the properties are non zero // thus if It's true, everything succeed
Но опять же я бы посоветовал вам выполнять обработку ошибок отдельно для каждой операции, когда это необходимо.