【问题标题】:How to re-index default Mongo index?如何重新索引默认的 Mongo 索引?
【发布时间】:2012-07-17 21:25:58
【问题描述】:

嗯,我正在修复一个包含 1 亿条记录的 MongoDB 集合。以前的开发人员用真正错误的东西覆盖了默认的_id。现在,当我修复它时,如何重新生成 _id 索引?除了mongoRestore,还有什么更快的方法吗?


这是我的更新过程:

1) 将数据库从原始数据库复制到另一个数据库。

2) 删除所有记录的 _id。

3)为所有记录重新生成_id(这就是我不知道该怎么做)

4)使用新的_id将集合复制回原始数据库(或者另一种方法是从新的/临时数据库中制作mongoDump,然后将文件发送到原始数据库,MongoRestore,即(然后每条记录都会有新的_id 。这种方式会起作用,但似乎更慢。)

【问题讨论】:

  • 为什么你认为你必须再生?
  • 嗯.. 因为 _id 被不正确的哈希值覆盖,导致冲突。所以,我需要删除旧的。然后用Mongo的默认方式恢复一个。
  • 如何恢复 _i​​d 值?如果您正在阅读每个文档然后更新_id,则无需重建索引。如果您想恢复到备份中的值,如何执行此操作取决于您的备份是如何进行的。
  • 这就是我想知道的。如何恢复 Mongo 默认生成的 _id 值。这是我的步骤。 (见上文)

标签: mongodb indexing mongodb-indexes


【解决方案1】:

默认的 MongoDB '_id' 值是在首次插入文档时由客户端的 MongoDB 驱动程序生成的。它是使用当前时间、运行客户端的机器的主机名、客户端的进程ID以及用于区分同一进程的多个操作的递增值生成的。

详情见http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

因此,除非您碰巧将我上面提到的所有信息作为条目存储在文档中,否则您无法重建原始的默认 MongoDB '_id' 值。

此外,“_id”字段是不可变的——不能更改。我不确定之前的开发人员是如何覆盖 _id 字段的——我最好的猜测是他获取了文档,更改了 _id 字段的值,删除了旧的,然后插入了新的。

如果在执行 'mongodump' 之后,除了 '_id' 字段之外的文档内容没有改变,那么获取数据的最快方法是恢复该转储文件。

如果您的文档内容已更改,并且您希望保留更改,那么您需要执行与之前开发人员相反的操作:获取集合中的每个文档,使用本地驱动程序的工具创建一个新的 ObjectID,删除旧文档并将数据保存为具有新 _id 的新文档。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    相关资源
    最近更新 更多