到目前为止,我所看到的所有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
基本上,我想对一个集合执行查找,并根据查找结果对另一个集合执行第二个操作。
我希望这两个动作一起成为原子动作。
答案 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()
因此,在上面的示例中,我们在各自的集合中创建/保存了两个不同的记录,然后根据新记录返回并更新它们。