使用mongodb事务时如何回读结果?

时间:2019-05-23 22:31:48

标签: mongodb transactions

到目前为止,我所看到的所有mongodb事务示例都不允许回读结果。例如(伪代码):

begin_transaction
collection_one.update(...)
collection_two.update(...)
commit_transaction

问题是,如果我想基于更新collection_one的结果来更新collection_two呢?

例如?

begin_transaction
result = collection_one.update(...)
if (result.update_count() > 0)
{
    collection_two.update(...)
}
commit_transaction

我从未见过像上面这样的例子吗?看来使用事务处理时,我无法获得结果。

另一个例子

begin_transaction
result = collection_children.find({name: 'xxx'})
collection_team.delete({name in result})
commit_transaction

基本上,我想对一个集合执行查找,并根据查找结果对另一个集合执行第二个操作。

我希望这两个动作一起成为原子动作。

1 个答案:

答案 0 :(得分:0)

这里是一个如何与Mongoose一起工作的示例。如果没有猫鼬,显然可以使用相同的示例。

var author = new Author({ email: "test22@test.com", other: [{a: 1}});
var book = new Book({ title: 'ABC' })

let doFoo = async () => {
  const session = await mongoose.startSession();
  session.startTransaction();
  try {
    const opts = { session, new: true };

    let _author = await author.save()  // Notice we get back the record
    let _book = await book.save()

    // Notice we are using now the new id of the just saved record
    await Author.findOneAndUpdate({ _id: _author.id }, { $set: { other: { foo: 2 } }},  opts);
    await Book.findOneAndUpdate({ _id: _book.id }, { $set: { title: "ABC" }},  opts);

    await session.commitTransaction();
    session.endSession();
  } catch (error) {
    await session.abortTransaction();
    session.endSession();
    throw error; // Rethrow so calling function sees error
  }
}

doFoo()

因此,在上面的示例中,我们在各自的集合中创建/保存了两个不同的记录,然后根据新记录返回并更新它们。