1

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


这是我的更新程序:

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

2)删除所有记录的_id。

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

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

4

1 回答 1

1

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

有关详细信息,请参阅http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification

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

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

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

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

于 2012-07-18T19:46:30.317 回答