Mongodb 的 Microsoft Cosmosdb:将未分片的集合合并到分片的集合中
Microsoft Cosmosdb for Mongodb: merge unsharded collection into sharded ones
我有 2 个类似文档的集合(即相同的对象,不同的值)。一个集合 (X) 在数据库 A 中未分片,另一个集合 (Y) 在数据库 B 中分片。当我尝试将集合 X 复制到数据库 B 中时,我收到错误提示 "Shared throughput collection should have a partition key"。我也试过使用foreach insert复制数据,但是时间太长了。
所以我的问题是,如何以有效的方式将集合 X 中的数据附加到集合 Y?
Mongodb CosmosDB 上的版本是 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
So my question is, how can I append the data from collection X to
collection Y in efficient way?
可以使用服务器工具mongodump and mongorestore。您可以将源集合数据导出到 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"
host/port 连接到分片集群的 mongos
。注意bson文件名需要在--dir
选项中指定。
导入将数据和索引添加到现有的分片集合中。进程只插入数据;无法更新现有文件。如果源集合中的 _id
值已经存在于目标集合中,进程 将不会覆盖 文档(并且不会导入这些文档,并且它不是错误)。
mongorestore
有一些有用的选项,例如:--noIndexRestore
和 --dryRun
。
因为 CosmosDB 中的 MongoDb 版本当前为 3.4.6,它不支持 $merge 和许多其他命令,例如 colleciton.copyTo 等。使用 Studio 3T 的导入功能没有'也无济于事。
我使用的解决方案是在本地 mongodb 下载目标集合,清理它然后编写 java 代码,从本地数据库和 insertMany(或 bulkwrite)读取我的干净数据它到目标集合。这样,数据将附加到目标集合。
我测量的速度是 1m 文档数(~750MB)需要 2 小时,当然,这个数字可能会因各种因素而有所不同,即网络,文档大小等
我有 2 个类似文档的集合(即相同的对象,不同的值)。一个集合 (X) 在数据库 A 中未分片,另一个集合 (Y) 在数据库 B 中分片。当我尝试将集合 X 复制到数据库 B 中时,我收到错误提示 "Shared throughput collection should have a partition key"。我也试过使用foreach insert复制数据,但是时间太长了。
所以我的问题是,如何以有效的方式将集合 X 中的数据附加到集合 Y?
Mongodb CosmosDB 上的版本是 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
So my question is, how can I append the data from collection X to collection Y in efficient way?
可以使用服务器工具mongodump and mongorestore。您可以将源集合数据导出到 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"
host/port 连接到分片集群的 mongos
。注意bson文件名需要在--dir
选项中指定。
导入将数据和索引添加到现有的分片集合中。进程只插入数据;无法更新现有文件。如果源集合中的 _id
值已经存在于目标集合中,进程 将不会覆盖 文档(并且不会导入这些文档,并且它不是错误)。
mongorestore
有一些有用的选项,例如:--noIndexRestore
和 --dryRun
。
因为 CosmosDB 中的 MongoDb 版本当前为 3.4.6,它不支持 $merge 和许多其他命令,例如 colleciton.copyTo 等。使用 Studio 3T 的导入功能没有'也无济于事。
我使用的解决方案是在本地 mongodb 下载目标集合,清理它然后编写 java 代码,从本地数据库和 insertMany(或 bulkwrite)读取我的干净数据它到目标集合。这样,数据将附加到目标集合。 我测量的速度是 1m 文档数(~750MB)需要 2 小时,当然,这个数字可能会因各种因素而有所不同,即网络,文档大小等