2017-10-10 6 views
1

私はmongodbにいくつかの破損した文書がありますので、修正しなければならない修復スクリプトを書きたいと思います。ただし、動作しません。ObjectIdから文字列にタイプを変更します

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); 
}); 

しかし、私はどのようにそれは例外

Failed to execute script.

Error: WriteError: The _id field cannot be changed from {_id: ObjectId('59cd189e6e5c9e1ca90b072c')} to {_id: "59cd189e6e5c9e1ca90b072c"}.

を行うことができますか? ObjectIdフィールドを文字列として逆シリアル化できないため、私は今ではアプリケーション層で例外が発生しています。

答えて

2

_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}); 
}); 
+0

。私はあなたの最後の2行を交換する方が良いと思います。 –

関連する問題