node.js - 在 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 选项。两者都正确吗?如果是,那么它们之间有什么区别?
解决方案
查看此代码示例,我推测您的情况没有真正的区别。您提供的第二个代码片段似乎更少的代码。第一个对我来说似乎与做这样的事情相同:
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();
}
可以在此处找到有关交易的进一步说明,还可以查看批量写入文档。
密切关注多文档交易。希望这可以帮助。快乐编码!
推荐阅读
- dataset - Power BI - 保留策略 - basicFIFO
- c# - 如何在 EasyNetQ 中获取现有的 Exchange 或队列?
- c# - “侦听器”上的事件不在 asp.net 中触发,但在控制台应用程序 c# 中有效
- sql - 需要在使用连接的同一查询中从 ID 中选择用户名。无法让它工作
- angular - 无法绑定到“data-html2canvas-ignore”,因为它不是“ng-container”的已知属性
- java - SpringBoot JPA Err: No Dialect mapping for JDBC type: 728890494
- apache-kafka - 我想将多个 Kafka 消息加载到 Nifi 中的多个 HDFS 文件夹
- c# - 如何实现具有继承的控制器级版本控制?
- java - 读取txt文件到hashmap,用“\t”分割
- keycloak - 为什么我在尝试进行身份验证时得到 502