回答:
更新できません。新しいを使用してドキュメントを保存してから_id
、古いドキュメントを削除する必要があります。
// store the document in a variable
doc = db.clients.findOne({_id: ObjectId("4cc45467c55f4d2d2a000002")})
// set a new _id on the document
doc._id = ObjectId("4c8a331bda76c559ef000004")
// insert the document, using the new _id
db.clients.insert(doc)
// remove the document with the old _id
db.clients.remove({_id: ObjectId("4cc45467c55f4d2d2a000002")})
duplicate key error
がinsert
表示され、@ skellyで言及された問題が心配されていない場合、最も簡単な解決策は、remove
最初にinsert
回線を呼び出してから、回線を呼び出すことです。doc
簡単な文書のために、挿入は失敗しても、最悪のケースを回復するのは簡単だろうので、すでにお使いの画面に印刷されなければなりません。
コレクション全体でそれを行うには、ループを使用することもできます(Nielsの例に基づく):
db.status.find().forEach(function(doc){
doc._id=doc.UserId; db.status_new.insert(doc);
});
db.status_new.renameCollection("status", true);
この場合、UserIdは、使用したい新しいIDでした。
list()
論理的なものですが、大規模なデータベースの場合、これはメモリを使い果たす可能性があります
同じコレクション内の_idの名前を変更したい場合(たとえば、いくつかの_idに接頭辞を付けたい場合):
db.someCollection.find().snapshot().forEach(function(doc) {
if (doc._id.indexOf("2019:") != 0) {
print("Processing: " + doc._id);
var oldDocId = doc._id;
doc._id = "2019:" + doc._id;
db.someCollection.insert(doc);
db.someCollection.remove({_id: oldDocId});
}
});
IF(doc._id.indexOf( "2019")!= 0){... forEachの挿入ドキュメントを取り出すため、無限ループを防ぐために必要であってもthrought .snapshot()メソッド使用。
find(...).snapshot is not a function
それ以外は素晴らしい解決策です。また、_id
カスタムIDで置き換える場合doc._id.toString().length === 24
は、無限ループを回避するかどうかを確認できます(カスタムIDも24文字ではないと想定)
ここでは、ループや古いドキュメントの削除のために、複数のリクエストを回避するソリューションがあります。
次のような方法で手動で新しいアイデアを簡単に作成できます。_id:ObjectId()
ただし、Mongoが欠落している場合は自動的に_idを割り当てることを知っているため、集約を使用し$project
てドキュメントのすべてのフィールドを含むを作成できますが、フィールド_idは省略できます。あなたはそれでそれを保存することができます$out
したがって、ドキュメントが次の場合:
{
"_id":ObjectId("5b5ed345cfbce6787588e480"),
"title": "foo",
"description": "bar"
}
次に、クエリは次のようになります。
db.getCollection('myCollection').aggregate([
{$match:
{_id: ObjectId("5b5ed345cfbce6787588e480")}
}
{$project:
{
title: '$title',
description: '$description'
}
},
{$out: 'myCollection'}
])
_id
は、MongoDBに別の値を生成させるのではなく、を特定の値に設定する必要があります。