Mongodb 使用MongoSpark更新mongoData

Mongodb 使用MongoSpark更新mongoData,mongodb,apache-spark,Mongodb,Apache Spark,来自Mongo提供的以下教程: MongoSpark.save(centenarians.write.option("collection", "hundredClub").mode("overwrite")) 我对Mongo首先删除集合,然后用新数据覆盖该集合的理解正确吗 我的问题是,是否可以使用MongoSpark连接器来实际更新Mongo中的记录 假设我得到的数据 {"_id" : ObjectId(12345), "name" : "John" , "Occupation" : "Ba

来自Mongo提供的以下教程:

MongoSpark.save(centenarians.write.option("collection", "hundredClub").mode("overwrite"))
我对Mongo首先删除集合,然后用新数据覆盖该集合的理解正确吗

我的问题是,是否可以使用
MongoSpark
连接器来实际更新Mongo中的记录

假设我得到的数据

{"_id" : ObjectId(12345), "name" : "John" , "Occupation" : "Baker"}
{"name" : "John", "address" : "1800 some street"}
然后我想做的是从另一个包含更多细节的文件中合并此人的记录,即该文件看起来像

{"_id" : ObjectId(12345), "name" : "John" , "Occupation" : "Baker"}
{"name" : "John", "address" : "1800 some street"}
目标是更新Mongo中的记录,因此现在JSON看起来像

{"_id" : ObjectId(12345) "name" : "John" , "address" : 1800 some street", "Occupation" : "Baker"}

现在,让我们假设我们只想更新John,并且有数百万条其他记录我们想保留原样。

这里有几个问题,我将尝试对它们进行分解

实际上,Mongo首先删除集合,然后用新数据覆盖该集合

正确,从v2.x开始,如果您指定模式
overwrite
,将首先将集合放入,然后将新结果保存到集合中。有关更多信息,请参阅

我的问题是,是否可以使用
MongoSpark
连接器来实际更新Mongo中的记录

mongo spark
v1.1+)上描述的补丁是,如果数据帧包含
\u id
字段,则数据将被删除。这意味着将更新具有相同
\u id
值的任何现有文档,并插入集合中没有现有
\u id
值的新文档

然后我想做的是从另一个包含更多细节的文件中合并此人的记录

如上所述,您需要知道集合中的
\u id
值。示例步骤:

  • 通过读取
    Person
    集合来检索
    John
    \u id
    值,创建数据帧(a)。i、 e.
    ObjectId(12345)
  • \u id
    ObjectId(12345)的值合并到您的数据帧中(B-来自另一个包含更多信息的文件)。使用唯一字段值连接两个数据帧(A和B)
  • 保存合并的数据帧(C)。不指定
    覆盖
    模式 我们只想更新约翰,还有数以百万计的其他记录,我们想保持原样


    在这种情况下,在合并两个数据帧之前,请从数据帧B(包含更多详细信息的另一个文件)中过滤掉任何不需要的记录。此外,在调用
    save()
    时,请指定模式
    append

    这是正确的。关于模式:
    Overwrite
    将始终替换集合,
    Append
    将在存在
    \u id
    时向上插入。