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

Node.js Nodejs mongodb在事务中查找和更新多个文档,node.js,mongodb,transactions,acid,Node.js,Mongodb,Transactions,Acid,我有一个mongo 4.2副本集。我有N个进程同时运行并试图读取一个集合。这个集合就像一个队列。我想在一个事务中读取100个元素并更新它们,这样其他进程就不会尝试读取这些元素 我的代码是: const collection = client.db("test").collection(TEST_COLLECTION); const session = client.startSession(); try { let data = null; await

我有一个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文档说明:当使用驱动程序时,事务中的每个操作都必须与会话相关联(即将会话传递给每个操作)

所以我假设这实际上不是事务性的,只是更新部分没有解决我的问题。有没有办法在我的交易中同时包含这两项内容?有什么想法吗?其他/更好的选择

谢谢

编辑: 所以我盯着我的问题看了15分钟,突然想到了。如果我首先使用事务更新。然后,即使在事务之外使用runId进行查询,我也可以实现我的目标。我说得对吗?这么简单吗

EDIT2: Edit1很蠢,现在我不能限制100个项目。回到起点

EDIT3:
我正在使用本机mongodb nodejs驱动程序。

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

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

请参见

谢谢您的回答!我忘了提到我使用的是本机mongodb驱动程序而不是mongoose。我检查了本机驱动程序是否也具有此功能(),但我希望获得多个文档,而不仅仅是一个文档。这就是为什么我想使用find()本机驱动程序的accepts会话作为一个选项。