我正在尝试在SQL和MongoDB之间设计一个ETL管道。 SQL Server充当事务数据库。 SQL中的新/更新数据被移动到MongoDB,以便为软件提供更快的验证。
在MongoDB中,有没有类似于SQL中的MERGE操作?我还没有找到基于主键相关的新加载文档批量插入/更新数千个mongoDB文档的示例。 mongoDB数据的示例看起来类似于以下内容,其中dbID是SQL中的主键:
{
_id: 1,
dbID: 1
val1: xx,
val2: aa
},
{
_id: 2,
dbID: 2
val1: y,
val2: bb
},
{
_id: 3,
dbID: 3
val1: x,
val2: cc
},
{
_id: 4,
dbID: 4
val1: z,
val2: bb
}
在同一个集合中,我从要处理的事务数据库加载任何更改。这些可以包括插入和更新。如何使用新信息批量覆盖/插入现有文档?
{
_id: 5,
dbID: 1
val1: x,
val2: UpdatedValue
Type: 'ETL'
SubType: 'Update'
},
{
_id: 6,
dbID: 3
val1: x,
val2: UpdatedValue
Type: 'ETL'
SubType: 'Update'
},
{
_id: 7,
dbID: 7
val1: qwert,
val2: xyz
Type: "ETL"
SubType: "Insert"
}
在SQL中,我将加入dbID,并更新/插入已更改的任何内容。 MongoDB中有这样的东西吗?目前我的解决方案是遍历所有类型:" ETL"一次记录一个,以处理对现有mongoDB记录的必要更改。如果有一种方法可以批量导入更改而不是循环遍历数千个文档,那就太棒了。
最终结果如下:
{
_id: 1,
dbID: 1
val1: xx,
val2: UpdatedValue
},
{
_id: 2,
dbID: 2
val1: y,
val2: bb
},
{
_id: 3,
dbID: 3
val1: x,
val2: UpdatedValue
},
{
_id: 4,
dbID: 4
val1: z,
val2: bb
},
{
_id: 7,
dbID: 7
val1: qwert,
val2: xyz
}
谢谢!
答案 0 :(得分:0)
我最终使用pymongo replace_one和upsert = True来完成这项任务。我在批量方法中批量处理了replace_one调用,并且每250个请求将它们发送到服务器。这似乎相当快,并且通过减少写入/删除次数的额外奖励来满足我的总体目标。 - ehoel