javascript - 如何在一个事务中更新多个相关的 mongo db 集合?
问题描述
我正在尝试一次更新多个相关的 mongodb 集合。
人
{"_id":1, "name":"jack",phone:"1234"}
个人资料
{"_id":1, "personid":1, "country":"Russia", lastvisitedon:"01/01/2010"}
{"_id":2, "personid":1, "country":"Canada", lastvisitedon:"01/01/2010"}
如何同时更新persons
和persondetails
集合,以便:
person.name
设置为“千斤顶”persondetails.lastvisitedon
设置为“2020 年 1 月 1 日”WHERE personid=1 and persondetails.country=Canada
事务必须是原子的。
最终结果如下所示:
人
{"_id":1, "name":"jack the reaper",phone:"1234"}
个人资料
{"_id":1, "personid":1, "country":"Russia", lastvisitedon:"01/01/2010"}
{"_id":2, "personid":1, "country":"Canada", lastvisitedon:"01/01/2020"}
我知道一个人应该避免加入 mongodb 但有时它是不可避免的,特别是如果persondetails
可以有大量的相关文件。
等效的 SQL 查询将是:
update p
set p.name = "jack the reaper", pd.lastvisitedon="01/01/2020"
from persons p
inner join persondetails pd on
p._id = pd.personid
where p.phone = "1234" and pd.country="Canada"
我从MongoDb 文档中知道现在可以进行多集合事务。但是我该如何解决上述问题呢?
想到的一种天真的方法是:
Open transaction
update persons collection where phone="1234"
var personid= get _id from persons collection
update persondetails collection where personid = personid and country = "canada"
Close transaction
在mongodb中这样做的正确方法是什么?
解决方案
推荐阅读
- seaborn - Seaborn heatmap colobar:如何确保正确的类顺序和正确的颜色显示
- node.js - 有没有办法在路由器之外的 express.js 中获取会话数据
- android - 如何在 Android 的自定义单选按钮中居中文本
- javascript - 在 QML 的 MenuBar 中插入图像
- julia - 使用 VegaLite.jl 缩放 x 轴和 y 轴
- android - 如何在本机反应中使按钮粘在ScrollView内的底部?
- react-native - 错误:使用 Asset.loadAsync 中的 localUri 用于 FileSystem.getInfoAsync 或 Android 上的 FileSystem.readAsStringAsync 时出现“位置...不可读”
- assembly - 将链接描述文件与程序集文件 [risc-v] 连接
- android - 如何在 Android 的 Radiobuttons 中缩放圆圈
- java - 如何在 Java 中保持随机化文本?