Docs 菜单
Docs 主页
/ /
/ / /

从在线存档恢复特定文档

重要

Flex 集群和无服务器实例中不可用的功能

Flex 集群和无服务器实例目前不支持此功能。要学习;了解详情,请参阅 Atlas Flex 限制无服务器实例限制。

本页介绍如何使用$merge 管道阶段恢复特定存档数据。这种方法允许您根据特定条件执行更精细的恢复。如果需要恢复整个集群,请参阅备份和恢复存档数据以了解更多详细信息。

注意

确保您的集群已针对要从存档恢复的数据量进行了充分配置。否则,在恢复期间或恢复之后,可能会运行空间不足的情况。请联系支持部门,获取有关设置oplog大小或解决Atlas 集群任何空间问题的其他技术指导。

您需要对项目具有Project Data Access Admin 或更高访问权限才能执行此过程。

对于具有大量分区的大型数据集(约 1TB 的数据),不建议使用此方法。

执行以下步骤,将特定存档数据恢复到Atlas 集群:

1

暂停与包含要恢复的存档数据的集合关联的 Online 存档 。

有关更多信息,请参阅暂停和恢复存档

2

您必须使用 Archive Only 连接string连接到 Online 存档。 要学习;了解更多信息,请参阅连接到 Online 存档。

3

要了解有关将数据移回 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"
}
}
])

该代码采用以下逻辑:

  • 如果存档文档在 itemsource 字段上与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

4

验证 Atlas 集群中的数据并删除在线存档。

有关详细信息,请参阅删除在线存档

注意

如果您在将数据迁移回Atlas 集群时运行问题,请联系支持部门。

后退

备份和恢复

在此页面上