0
                execTransaction(session => {
                    return async () => {
                        await db.collection('table1').updateOne({ username: username }, { $push: { apps: client_id } }, { session });
                        await db.collection('table2').insertOne({ data: data }, { session });
                    };
                }, data => {
                    console.log(data); //data.result.ok = 1
                 
                });

withTransaction在 nodejs 中使用来运行事务。

当我正确运行事务时,data.result.ok = 1

但是当我使用 no exist username runupdateOne时,结果仍然是1

如何验证结果?

4

1 回答 1

0

insertOne如果成功应该返回Object这样的

{
  acknowledged: true,
  insertId: <object OjectId> // or the _id you specified
}

updateOne如果成功应该返回Object这样的

{
  acknowledged: true,
  modifiedCount: 1, // or 0 if upserted
  upsertedId: null, // or an <object OjectId>
  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 => {
    return async () => {
      await Promise.all([
        db.collection('table1').updateOne({ username: username }, { $push: { apps: client_id } }, { session }),
        db.collection('table2').insertOne({ data: data }, { session })
      ])
    };
  }, data => {
    if (data[0].matchedCount === 0) {
      // do error handling ?
    }
  }
)

或者,如果您想知道所有 CRUD 操作是否如标题所示成功,也许是这个?

(await Promise.all([a list of all insertOne and updateOne operations... ])
  .every(obj => obj && obj.acknowledged && (obj.insertId || obj.modifiedCount || obj.upsertedCount))
// this checks if all the properties are non zero
// thus if It's true, everything succeed

但我再次建议您在需要时为每个操作单独进行错误处理。

于 2021-12-05T22:01:46.540 回答