好吧,我正在修复一个拥有1亿条记录的MongoDB集合。以前的开发人员用真正错误的东西覆盖默认的_id。现在,当我修复它时,如何重新生成_id索引?除了mongoRestore,还有更快的方法吗?
这是我的更新程序:
1)将数据库从原始数据库复制到另一个数据库。
2)删除所有记录的_id。
3)为所有记录重新生成_id(这就是我不知道该怎么做)
4)使用新的_id将集合复制回原始数据库(或者另一种方法是从新的/ temp数据库中创建mongoDump,然后将文件发送到原始数据库,MongoRestore ie(然后每个记录都会有新的_id。这种方式可行,但看起来更慢。)
答案 0 :(得分:1)
默认的MongoDB'_id'值是在首次插入文档时由客户端的MongoDB驱动程序生成的。它是使用当前时间,运行客户端的计算机的主机名,客户端的进程ID以及用于通过同一进程区分多个操作的递增值生成的。
有关详细信息,请参阅http://www.mongodb.org/display/DOCS/Object+IDs#ObjectIDs-BSONObjectIDSpecification
因此,除非您碰巧将上面提到的所有信息存储为文档中的条目,否则您无法重建原始默认的MongoDB'_id'值。
此外,'_ id'字段是不可变的 - 它无法更改。我不确定以前的开发人员是如何首先覆盖_id字段的 - 我最好的猜测是他获取了文档,更改了_id字段的值,删除了旧文件,并插入了新文件。
如果您执行'mongodump'后,除了'_id'字段之外的文档内容没有改变,那么获取数据的最快方法就是恢复该转储文件。
如果您的文档内容已经更改,并且您想要保留更改,那么您需要执行与之前的开发人员相反的操作:获取集合中的每个文档,使用本机驱动程序的工具创建一个新的ObjectID,删除旧文档并将数据保存为带有新_id的新文档。