gpt4 book ai didi

node.js - 将大型 MongoDB 实例中的字符串索引更改为 ObjectID 索引

转载 作者:太空宇宙 更新时间:2023-11-04 00:08:50 24 4
gpt4 key购买 nike

所以,我已经 git 了一个大型生产数据库转储,其中 _id 字段作为 string。不同的集合使这些字符串的长度不同。那里有很多关系。我需要一种方法将字符串 _ids 更改为 ObjectId

我已经尝试过:

1)在 mongoose/mongodb 文档中查找单个命令来执行此操作失败

2) 如果我们尝试删除并重新创建方法,或者出现有关错误字符串长度和无法从该字符串创建 ObjectId 的错误,则获取一个集合中的所有条目并将 string id 包装到 ObjectId 的 node.js 迁移脚本会因堆栈溢出 fatal error :CALL_AND_RETRY_LAST 分配失败 - JavaScript 堆内存不足而失败。

稍后将附加数据示例和/或 Mongoose 架构。

最佳答案

避免 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 的字符串化版本。在这种情况下,关系无法保留。

关于node.js - 将大型 MongoDB 实例中的字符串索引更改为 ObjectID 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50951399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com