Microsoft Cosmosdb for Mongodb:将未分片集合合并为分片集合



我有 2 个类似文档的集合(即相同的对象,不同的值(。一个集合 (X( 在数据库 A 中未分片,另一个集合 (Y( 在数据库 B 内分片。当我尝试将集合 X 复制到数据库 B 时,出现错误,指出"共享吞吐量集合应具有分区键"。我也尝试使用 foreach 插入复制数据,但这需要很长时间。

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

CosmosDB上的Mongodb版本是3.4.6

您可以执行聚合并添加为最后阶段$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

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

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

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

下面是相关方案的示例:

mongodump --db=srcedb --collection=srcecoll --out="C:mongodumps"

这将创建一个具有数据库名称的转储目录。其中将有"srcecoll.bson"文件,用于导入。

mongorestore --port 26xxxx --db=trgtdb --collection=trgtcoll --dir="C:mongodumpssrcecoll.bson"

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

导入会将数据和索引添加到现有分片集合中。该过程仅插入数据;无法更新现有文档。如果目标集合中已存在源集合中的_id值,则进程不会覆盖文档(并且不会导入这些文档,并且不会出错(。

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

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

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

最新更新