我的mongodb中有一些损坏的文件,所以我想写一个应该修复它的修复脚本。但是,它不起作用。
db.History.find({_id:{ $type: "objectId" }}).forEach( function (x) {
x._id = x._id.valueOf(); // convert field to string
db.History.replaceOne({BId:x.BId, "Version.Version": x.Version.Version}, x);
});
但我得到了一个例外
无法执行脚本。
错误:WriteError:无法从{_id更改_id字段: ObjectId('59cd189e6e5c9e1ca90b072c')}到{_id: “59cd189e6e5c9e1ca90b072c”}。
怎么做?我现在在我的应用层中有一个例外,因为它无法将ObjectId字段反序列化为字符串。
答案 0 :(得分:4)
文档的_id
值是不可变的,因此您需要使用更正的_id
值创建文档的新副本,然后删除原始文档。
类似于:
db.History.find({_id:{ $type: "objectId" }}).forEach( function (x) {
var oldId = x._id;
x._id = x._id.valueOf(); // convert field to string
db.History.insert(x);
db.History.remove({_id: oldId});
});