2017-06-22 40 views
0

我试图设计SQL和MongoDB之间的ETL管道。 SQL服务器充当事务数据库。来自SQL的新/更新数据移至MongoDB,以提供对软件更快的验证。MongoDB MERGE等效 - 批量处理从SQL插入/更新到现有文档中

在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中有这样的事情吗?目前,我的解决方案是逐个遍历所有Type:“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

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

回答

0

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