Nodejs mongodb 在事务中查找和更新多个文档

Nodejs mongodb find and update multiple documents in transaction

我有一个 mongo 4.2 副本集。我同时有 N 个进程 运行 并试图读取一个集合。这个集合就像一个队列。我想读取 100 个元素并在事务中更新它们,这样其他进程就不会尝试读取这些元素。

我的代码是:

const collection = client.db("test").collection(TEST_COLLECTION);

const session = client.startSession();

try {

    let data = null;

    await session.withTransaction(async () => {
        console.log("starting transaction")

        data = await collection.find({ runId: null }, { _id: 1, limit: 100 }).toArray();

        const idList = data.map(item => item._id.toHexString());

        await collection.updateMany(
            { runId: { $in: idList } },
            { $set: { runId: runId } },
            { session });

        console.log("Successful transaction")
    });

    data.map(item => {
        // process element one by one and update them (no need for transaction here)
    })

} catch (e) {
    console.error("The transaction was aborted due to an unexpected error: " + e);
} finally {
    await session.endSession();
    console.log("Closing transaction")
}

这是我现在得到的代码。问题是 find() 不会接受选项,所以我无法通过会话。这意味着它不会成为交易的一部分。

mongodb 文档指出:使用驱动程序时,事务中的每个操作都必须与会话相关联(即将会话传递给每个操作)。

所以我假设这实际上不是事务性的,只是更新部分没有解决我的问题。有什么办法可以将两者都包含在我的交易中吗?对此有什么想法吗? Other/better 个选项?

谢谢

编辑: 因此,当它击中我时,我盯着我的问题看了 15 分钟。如果我先使用事务更新。然后即使在事务之外使用 runId 查询我也可以实现我的目标。我对吗?有那么容易吗?

编辑2: Edit1 很愚蠢,现在我不能限制为 100 个项目。回到开始。

编辑 3: 我正在使用本机 mongodb nodejs 驱动程序。

要在事务中使用 find,请使用 session 方法传递会话:

doc = await Customer.findOne({ name: 'Test' }).session(session);

Transactions in Mongoose