【问题标题】:Mongorestore to update records if already exists without --dropMongorestore 在没有 --drop 的情况下更新记录(如果已经存在)
【发布时间】:2014-09-22 06:32:34
【问题描述】:

我收集了大量数据,每个周末我都必须将它们转移到另一台机器上。所以我计划进行增量备份和恢复。如实验所示,如果 _id 已经存在,mongorestore 永远不会合并数据。 基于上述问题,我尝试使用 mongoimport 和 export ,但存在相同的问题,因为现有记录未合并。任何可能的解决方案都会有所帮助。

mongoimport 命令中的错误由 :: 11000 E11000 重复键引起 错误索引:news.news_data.$id 复制键:{: ObjectId('5404410d9f5323ef734dac68') }

【问题讨论】:

标签: mongodb database-backups


【解决方案1】:

第一种情况是正确的。如果已经存在,Mongorestore 不会更新文档。还原时会跳过这些文档。 在第二种情况下,请尝试使用带有 --upsert 选项的 mongoimport。如果 _id 已经存在,它将合并记录。

例子:

mongoimport --db dbname --collection collname --upsert --file file.json

【讨论】:

  • 请注意,mongoimport 导入 json,它没有使用 bson 的 mongorestore 将拥有的所有类型信息。另外,我不太明白问题出在哪里 - 如果您要传输转储,为什么不删除旧数据以免重复?
  • @wdberkeley:选择upsert 而不是删除+恢复的一些潜在原因:在大型集合中只更新了少数文档;不想浪费时间重新创建索引;只为 changeStreams 发出必要的更改。
【解决方案2】:

请为ticket to add an upsert option to mongorestore投票。

在实现之前,我们找到了解决方法:

  1. 从服务器 A 转储集合(原始)
  2. 从服务器 B 转储集合(目标)
  3. 在服务器 B 4 上使用删除集合 A 进行还原
  4. 在服务器 B 上恢复 不丢弃集合 B

在这种情况下,更新的文档不会被覆盖

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-04
    相关资源
    最近更新 更多