Как узнать, что транзакция mongodb прошла успешно?

#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  

Но опять же я бы посоветовал вам выполнять обработку ошибок отдельно для каждой операции, когда это необходимо.