MongoDB MERGE等效 - 从SQL到现有文档的批量进程插入/更新

时间:2017-06-22 15:04:08

标签: mongodb merge mongodb-query etl

我正在尝试在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
}

谢谢!

1 个答案:

答案 0 :(得分:0)

我最终使用pymongo replace_one和upsert = True来完成这项任务。我在批量方法中批量处理了replace_one调用,并且每250个请求将它们发送到服务器。这似乎相当快,并且通过减少写入/删除次数的额外奖励来满足我的总体目标。 - ehoel