_id
のみで構成される新しいコレクションが必要な場合を除いて、これはmapReduce操作ではありません。 およびvalue
次のように、mapReduce出力から生成されるフィールド:
"_id": ObjectId("53f2b954b55e91756c81d3a5"),
"value": {
"domain": "example.com",
...
}
}
せいぜい、コレクションの一種の「サーバー側」の手直しですが、もちろん、必要な構造ではありません。
サーバー内のすべてのコードを実行する方法はありますが、実際にその場にいる場合を除いて、実行しようとしないでください。これらの方法は、一般的にシャーディングではうまく機能しません。シャーディングは通常、レコードのサイズが非常に大きいために人々が「実際にその場にいる」場所です。
物事を変更して一括で実行する場合は、通常、現在のドキュメント情報にアクセスしながら、収集結果を「ループ」して更新を処理する必要があります。つまり、「更新」が、ドキュメントのフィールドまたは構造にすでに含まれている情報に「基づいている」場合です。
したがって、「正規表現の置換」操作は使用できません。また、フィールドの名前を変更する操作もありません。それでは、バルク操作 でループしましょう。 サーバー上ですべてのコードを実行せずにこれを行う「最も安全な」形式の場合。
var bulk = db.collection.initializeOrderedBulkOp();
var counter = 0;
db.collection.find().forEach(function(doc) {
for ( var k in doc ) {
if ( doc[k].match(/^2014.*/) ) {
var update = {};
update["$unset"][k] = 1;
update["$set"][ k.replace(/(\d+)-(\d+)-(\d+).+/,"$1$2$3") ] = doc[k];
bulk.find({ "_id": doc._id }).updateOne(update);
counter++;
}
}
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
});
if ( counter % 1000 != 0 )
bulk.execute();
つまり、主なものは $unset<です。 / code>
既存のフィールドと$setを削除する演算子
ドキュメントに新しいフィールドを作成する演算子。 「フィールド名」と「値」の両方を調べて使用するには、ドキュメントのコンテンツが必要です。したがって、他に方法がないため、ループが発生します。
サーバーにMongoDB2.6以降がない場合でも、ループの概念はすぐにパフォーマンスを向上させることなく維持されます。 .eval()
>
サーバー上で処理するためですが、ドキュメントが示唆しているように、実際にはお勧めしません。必要な場合は注意して使用してください。