確かに、あなたがしたいのが 
を取り除くことだけなら テキストからエンティティを取得し、グローバル一致を実行して置換します:
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
db.tests.update({ "_id": doc._id },{ "$set": { "name": doc.name } });
});
したがって、すべての組み合わせを書き出す必要はありません。正規表現は、非常に一致するものを / g
に置き換えます。 オプション。おそらく/m
も使用します 複数行の場合、「名前」文字列には改行文字が含まれます。基本的な
$setを使用することもお勧めします。コード>
.save()
ではなく、本当に必要なフィールドのみを変更するため ドキュメント全体を元に戻します。トラフィックが少なくなり、ドキュメントが読み取られてから別のプロセスによって行われた可能性のある変更が上書きされる可能性が低くなります。
理想的には、MongoDBバージョン2.6以降でBulkOperationsAPIを使用します。これにより、更新を「バッチ処理」できるため、クライアントとサーバー間のトラフィックが再び減少します。
var bulk = db.tests.initializeOrderedBulkOp();
var count = 0;
db.tests.find({ "name": /\ /g }).forEach(function(doc) {
doc.name = doc.name.replace(/ /g,"");
bulk.find({ "_id": doc._id })
.updateOne({ "$set": { "name": doc.name } });
count++;
if ( count % 1000 == 0 ) {
bulk.execute();
bulk = db.tests.initializeOrderedBulkOp();
}
});
if ( count % 1000 != 0 )
bulk.execute();
これらは、これを改善するための主な方法です。残念ながら、MongoDB更新ステートメントがこのように更新式の一部として既存の値を使用する方法はないため、ループするしか方法はありませんが、示されているように操作を減らすために多くのことを行うことができます。