首页 > 解决方案 > 在 updateOne 选项中传递会话与在 mongoose nodejs 中的 bulkWrite 选项中传递会话有什么区别

问题描述

我试图了解 mongoose 的 bulkWrite 操作,我遇到了一种情况,我必须处理 4 个不同集合的所有事务或不处理。以下是2个代码,我不明白它们有何不同

const sess = await mongoose.startSession();
sess.startTransaction();
for (let data of lotOfData) {
    bulkUpdateArr.push({
        updateOne: {
            "filter": { _id: mongoose.Types.ObjectId(data._id) },
            "update": {
                $set: data,
            },
            "options": {
                "upsert": true,
                "new": true,
                "session":sess
            }
        }
    })
}
await Products.bulkWrite(bulkUpdateArr,{"ordered":false});

另一个代码是

const sess = await mongoose.startSession();
sess.startTransaction();
for (let data of lotOfData) {
    bulkUpdateArr.push({
        updateOne: {
            "filter": { _id: mongoose.Types.ObjectId(data._id) },
            "update": {
                $set: data,
            },
            "options": {
                "upsert": true,
                "new": true,
            }
        }
    })
}
await Products.bulkWrite(bulkUpdateArr,{"ordered":false,"session":sess});

如您所见,在第一个代码中,我明确地为所有 updateOne 提供会话,而在第二个代码中,我只是将其提供给 bulkWrite 选项。两者都正确吗?如果是,那么它们之间有什么区别?

标签: node.jsmongodbmongoose

解决方案


查看此代码示例,我推测您的情况没有真正的区别。您提供的第二个代码片段似乎更少的代码。第一个对我来说似乎与做这样的事情相同:

const session = client.startSession();
session.startTransaction();
try {
        await db
            .collection('Account')
            .findOneAndUpdate({ name: 'A' }, { $set: { balance: 6 } }, { session });
         await db
            .collection('Account')
            .findOneAndUpdate({ name: 'B' }, { $set: { balance: 6 } }, { session });
        await db
            .collection('Account')
            .findOneAndUpdate({ name: 'B' }, { balance: 7 }, { session });
        await session.commitTransaction();
} catch (error) {
       ...
} finally {
        session.endSession();
} 

可以在此处找到有关交易的进一步说明,还可以查看批量写入文档

密切关注多文档交易。希望这可以帮助。快乐编码!


推荐阅读