Mongodb 如何重新索引默认Mongo索引?
嗯,我正在修复一个MongoDB收藏,它有1亿条记录。以前的开发人员用一些真正错误的东西覆盖了默认的_id。现在,当我修复它时,如何重新生成_id索引?除了mongoRestore,还有更快的方法吗Mongodb 如何重新索引默认Mongo索引?,mongodb,indexing,mongodb-indexes,Mongodb,Indexing,Mongodb Indexes,嗯,我正在修复一个MongoDB收藏,它有1亿条记录。以前的开发人员用一些真正错误的东西覆盖了默认的_id。现在,当我修复它时,如何重新生成_id索引?除了mongoRestore,还有更快的方法吗 以下是我的更新过程: 1) 将数据库从原始数据库复制到另一个数据库 2) 删除所有记录的_id 3) 为所有记录重新生成_id(我不知道该怎么做) 4) 使用新的_id将集合复制回原始数据库(或者另一种方法是从新的/temp数据库生成mongoDump,然后将文件发送到原始数据库MongoRest
以下是我的更新过程: 1) 将数据库从原始数据库复制到另一个数据库 2) 删除所有记录的_id 3) 为所有记录重新生成_id(我不知道该怎么做)
4) 使用新的_id将集合复制回原始数据库(或者另一种方法是从新的/temp数据库生成mongoDump,然后将文件发送到原始数据库MongoRestore,即(然后每个记录都将具有新的_id。这种方法可以工作,但速度似乎较慢)当文档首次插入时,客户端的MongoDB驱动程序将生成默认MongoDB“\u id”值。该值使用当前时间、客户端运行的计算机的主机名、客户端的进程id以及用于区分同一进程的多个操作的递增值生成 有关详细信息,请参阅 因此,除非您碰巧将上面提到的所有信息作为条目存储在文档中,否则您无法重建原始默认MongoDB'_id'值 此外,“\u id”字段是不可变的——它不能更改。我不确定以前的开发人员首先是如何重写_id字段的——我最好的猜测是他获取了文档,更改了_id字段的值,删除了旧的,然后插入了新的 如果自执行“mongodump”后,文档中除“\u id”字段以外的内容没有更改,那么恢复数据的最快方法就是恢复该转储文件
如果文档的内容已更改,并且您希望保留更改,那么您需要执行与以前的开发人员相反的操作:获取集合中的每个文档,使用本机驱动程序的工具创建新的ObjectID,删除旧文档,并将数据保存为具有新id的新文档。默认MongoDB“\u id”值是在首次插入文档时由客户端的MongoDB驱动程序生成的。它是使用当前时间、运行客户端的计算机的主机名、客户端的进程id以及用于区分同一进程的多个操作的递增值生成的 有关详细信息,请参阅 因此,除非您碰巧将上面提到的所有信息作为条目存储在文档中,否则您无法重建原始默认MongoDB'_id'值 此外,“\u id”字段是不可变的——它不能更改。我不确定以前的开发人员首先是如何重写_id字段的——我最好的猜测是他获取了文档,更改了_id字段的值,删除了旧的,然后插入了新的 如果自执行“mongodump”后,文档中除“\u id”字段以外的内容没有更改,那么恢复数据的最快方法就是恢复该转储文件
如果您的文档内容已更改,并且您希望保留更改,那么您需要执行与以前的开发人员相反的操作:获取集合中的每个文档,使用本机驱动程序的工具创建新的ObjectID,删除旧文档,并将数据保存为具有新id的新文档。为什么你认为你必须重新生成吗?嗯..因为_id被一个importer散列值覆盖,导致冲突。所以,我需要删除旧的。然后用Mongo的默认方式还原一个。你如何还原_id值?如果你正在读取每个文档,然后更新_id,你不需要重建索引。如果如果要还原到备份中的值,如何执行此操作取决于备份的方式。这就是我想知道的。如何还原默认情况下由Mongo生成的_id值。以下是我的步骤。(请参阅上文)为什么您认为必须重新生成?嗯..因为_id被importer散列值覆盖,导致冲突。因此,我需要删除旧的。然后用Mongo的默认方式还原一个。您如何还原_id值?如果您正在读取每个文档,然后更新_id,则无需重建索引。如果您想还原到备份中的值,那么如何还原取决于备份的方式。这就是我想知道的。如何还原默认情况下由Mongo生成的_id值。以下是我的步骤。(参见上文)