本页介绍如何使用$merge 管道阶段恢复特定存档数据。这种方法允许您根据特定条件执行更精细的恢复。如果需要恢复整个集群,请参阅备份和恢复存档数据以了解更多详细信息。
注意
必需的访问权限
您需要对项目具有Project Data Access Admin 或更高访问权限才能执行此过程。
Considerations
对于具有大量分区的大型数据集(约 1TB 的数据),不建议使用此方法。
步骤
执行以下步骤,将特定存档数据恢复到Atlas 集群:
暂停与包含要恢复的存档数据的集合关联的 Online 存档 。
有关更多信息,请参阅暂停和恢复存档。
使用连接字符串连接到 Online 存档 。
您必须使用 Archive Only 连接string连接到 Online 存档。 要学习;了解更多信息,请参阅连接到 Online 存档。
使用 阶段将数据从存档移至Atlas$merge 集群。
要了解有关将数据移回 Atlas 集群的 $merge 管道阶段语法和用法的更多信息,请参阅 $merge 管道阶段。
例子
考虑 S3 存档中的以下文档:
{ "_id" : 1, "item": "cucumber", "source": "nepal", "released": ISODate("2016-05-18T16:00:00Z") } { "_id" : 2, "item": "miso", "source": "canada", "released": ISODate("2016-05-18T16:00:00Z") } { "_id" : 3, "item": "oyster", "source": "luxembourg", "released": ISODate("2016-05-18T16:00:00Z") } { "_id" : 4, "item": "mushroom", "source": "ghana", "released": ISODate("2016-05-18T16:00:00Z") }
假设您打算在item source$merge阶段根据 和$merge 字段恢复文档。以下代码示例展示了使用 阶段根据该条件恢复存档数据的示例:
db.<collection>.aggregate([ { "$merge": { "into": { "atlas": { "clusterName": "<atlas-cluster-name>", "db": "<db-name>", "coll": "<collection-name>" } }, "on": [ "item", "source" ], "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ])
该代码采用以下逻辑:
如果存档文档在
item和source字段上与Atlas 集群上的文档匹配,则Atlas会保留集群中的现有文档,因为Atlas 集群上的文档副本比存档版本更新。如果存档文档与Atlas 集群中的任何文档都不匹配,则Atlas会将该文档插入到Atlas 集群上的指定集合中。
将数据恢复到Atlas 集群时,存档数据可能具有重复的_id 字段。对于此示例,我们可以在 阶段之前加入一个$sort _id阶段,用于对 和released $merge字段进行排序,以确保Atlas在需要解决重复项时选择具有最新日期的文档。
以下代码示例添加了$sort 阶段:
db.runCommand({ "aggregate": "<collection>", "pipeline": [ { $sort: { "_id": 1, "released": 1, } }, { "$merge": { "into": { "atlas": { "clusterName": "<atlas-cluster-name>", "db": "<db-name>", "coll": "<collection-name>" } }, "on": [ "item", "source" ], "whenMatched": "keepExisting", "whenNotMatched": "insert" } } ], "cursor": { } }, { "background": true } )
要了解有关解决重复字段的更多信息,请参阅 $merge 注意事项。
注意
如果有多个on字段,则必须在on标识符字段上创建复合唯一索引:
db.<collection>.createIndex( { item: 1, source: 1 }, { unique: true } )
或者,指定按顺序合并到临时集合(每个 on 标识符字段一个)。然后,使用集群的连接字符串将临时集合中的数据合并到目标集合。您仍须为每个 on 标识符字段创建唯一索引。
您可以通过将background 标志设置为true 在背景运行聚合阶段。要在 中运行此命令,请使用mongosh db.runCommand。
验证 Atlas 集群中的数据并删除在线存档。
有关详细信息,请参阅删除在线存档。
注意
如果您在将数据迁移回Atlas 集群时运行问题,请联系支持部门。