首页 文章

在大型MongoDB实例中将字符串索引更改为ObjectID

提问于
浏览
1

所以,我使用 _id 字段作为 strings git一个大型 生产环境 数据库转储 . 不同的收藏品在那里得到了很多关系#634788_ . 我需要一种方法将字符串 _ids 更改为 ObjectId .

我已经尝试过了:

1)查看单个命令的mongoose / mongodb文档来执行该操作失败

2)node.js迁移脚本,它抓取一个集合中的所有条目并将 string id包装到 ObjectId 中,因为堆栈溢出而失败了 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 如果我们尝试删除并重新创建方法或者出现关于错误字符串长度的错误无法从该字符串创建 ObjectId .

稍后将附加数据样本和/或mongoose模式 .

1 回答

  • 1

    避免JavaScript堆内存不足的简单而低效的游标解决方案是序列化每个类型 . 当然,为了编辑 _id ,您必须创建一个新文档并删除旧文档 .

    const cursor = Model.find().lean().cursor();
    let doc;
    while ((doc = await cursor.next())) {
      // The string must be a valid ObjectId, otherwhise it won't work
      if (typeof doc._id === 'string') {
        let newId = new mongoose.Types.ObjectId(doc._id);
        let newDoc = new Model(Object.assign({}, doc, {_id: newId}));
        await newDoc.save();
        await Model.remove({_id: doc._id});
      }
    }
    

    但是,如果您有关于错误ID的错误,则可能是因为字符串ID实际上不是mongo ObjectId的字符串化版本 . 在这种情况下,不能保持这种关系 .

相关问题