【问题标题】:Microsoft Cosmosdb for Mongodb: merge unsharded collection into sharded onesMicrosoft Cosmosdb for Mongodb:将未分片的集合合并到分片的集合中
【发布时间】:2020-01-06 15:06:01
【问题描述】:

我有 2 个相似文档的集合(即相同的对象,不同的值)。一个集合(X)在数据库 A 中未分片,另一个集合(Y)在数据库 B 中分片。当我尝试将集合 X 复制到数据库 B 中时,我收到错误消息,提示“共享吞吐量集合应该有一个分区键”。我也尝试使用 foreach insert 复制数据,但耗时太长。

所以我的问题是,如何以有效的方式将数据从集合 X 附加到集合 Y?

CosmosDB 上的 Mongodb 版本是 3.4.6

【问题讨论】:

  • 你知道这两个集合是否有不同的_id 字段值集吗?

标签: mongodb azure-cosmosdb-mongoapi


【解决方案1】:

您可以执行聚合并添加为最后阶段$merge 运算符。

| $merge                                | $out                                       | 
| Can output to a sharded collection.   | Cannot output to a sharded collection.     | 
| Input collection can also be sharded. | Input collection, however, can be sharded. | 

https://docs.mongodb.com/manual/reference/operator/aggregation/merge/#comparison-with-out

【讨论】:

  • 是否有替代 $merge 命令的方法?使用支持 mongodb 至 3.4 版本的 cosmosdb。实际上,我想要类似于 SQL 命令 Union 的东西,它将数据从集合 B 附加到集合 A。哦,是的,cosmosdb 不支持 mongoimport,因为它提供了自己的迁移服务。
【解决方案2】:

所以我的问题是,如何将集合 X 中的数据附加到 以有效的方式收集 Y?

可以使用服务器工具mongodumpmongorestore。您可以将源集合数据导出到 BSON 转储文件并导入目标集合。这些过程非常快,因为数据库中的数据已经是 BSON 格式了。

可以使用这些工具将数据从非分片集合导出到分片集合。在这种情况下,要求源集合具有带值的分片键字段(或字段)。请注意,源集合中的索引也会被导出和导入(使用这些工具)。

以下是相关场景的示例:

mongodump --db=srcedb --collection=srcecoll --out="C:\mongo\dumps"

这将创建一个带有数据库名称的转储目录。里面会有“srcecoll.bson”文件,用于导入。

mongorestore --port 26xxxx --db=trgtdb --collection=trgtcoll --dir="C:\mongo\dumps\srcecoll.bson"

主机/端口连接到分片集群的mongos。注意bson文件名需要在--dir选项中指定。

导入将数据和索引添加到现有的分片集合中。进程只插入数据;现有文件无法更新。如果源集合中的_id 值已经存在于目标集合中,则进程不会覆盖文档(并且这些文档不会被导入,这不是错误)。 p>

mongorestore 有一些有用的选项,例如:--noIndexRestore--dryRun

【讨论】:

  • 感谢您的回答,但是 cosmosdb 不支持 mongorestore,因为它提供了自己的迁移服务。并且该服务无法将数据附加到现有集合中。它只能覆盖
  • 源集合有多大?
  • 它很大,所以使用插入和批量插入将不起作用。大小约为 7GB。任何想法如何在没有 $merge 的情况下合并数据并插入批量?
【解决方案3】:

因为 CosmosDB 中的 MongoDb 版本目前是 3.4.6,它不支持 $merge 和许多其他命令,例如 colleciton.copyTo 等。使用 Studio 3T 的导入功能也没有帮助。

我使用的解决方案是在我的本地 mongodb 上下载目标集合,清理它然后编写 Java 代码,该代码将从本地 db 读取我的干净数据并将其插入(或批量写入)到目标集合。这样,数据将被附加到目标集合中。 我测量的速度是 1m 文档数(~750MB)的 2 小时,当然,这个数字可能会因各种因素而异,例如网络、文档大小等。

【讨论】:

    猜你喜欢
    • 2013-08-31
    • 2018-12-15
    • 1970-01-01
    • 2021-07-26
    • 2012-05-10
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多