は、以下のタイトルケースを変更するためのアルゴリズムは、Array.prototype.map()
方法及び交換によって置換パターンの一部またはすべてのマッチを持つ新しい文字列を返すString.prototype.replace()
方法を使用します。 あなたの場合、replace()
メソッドのパターンはString
になり、新しい置換えに置き換えられ、逐語的な文字列として扱われます。
まず、map()
メソッドを適用する前に、文字列を小文字にして分割する必要があります。変換を実装する関数を定義したら、コレクションを反復してこの関数で更新を適用する必要があります。ループを行うには、ループの中にあなたがしてupdateOne()
方法を使用して、各ドキュメントの更新を実行することができますfind()
によって返されたカーソル上のcursor.forEach()
メソッドを使用します。
は比較的小さなデータセットの場合は、全体の動作を更新するためのBulk()
APIを使用しての利点を取る、特に巨大なデータセットを扱うパフォーマンスを向上させるため、以下の
function titleCase(str) {
return str.toLowerCase().split(' ').map(function(word) {
return word.replace(word[0], word[0].toUpperCase());
}).join(' ');
}
db.collection.find({}).foEach(function(doc){
db.collection.updateOne(
{ "_id": doc._id },
{ "$set": { "desc": titleCase(doc.desc) } }
);
});
で記述することができますバッチでサーバーに操作を送信するときに、効率的に一括して収集することができます(たとえば、バッチサイズは500)。これにより、すべてのリクエストをサーバーに送信するのではなく、500リクエストごとに1回だけ送信するので、更新をより効率的かつ迅速に行うので、パフォーマンスが大幅に向上します。
次に、このアプローチを示し、最初の例では、MongoDBのバージョン> = 2.6及び< 3.2で利用可能Bulk()
APIを使用します。上記の関数を使用して、desc
フィールドのタイトルを変換することによって、コレクション内のすべてのドキュメントを更新します。
MongoDBのバージョン> = 2.6及び< 3.2:
function titleCase(str) {
return str.toLowerCase().split(' ').map(function(word) {
return word.replace(word[0], word[0].toUpperCase());
}).join(' ');
}
var bulk = db.collection.initializeUnorderedBulkOp(),
counter = 0;
db.collection.find().forEach(function (doc) {
bulk.find({ "_id": doc._id }).updateOne({
"$set": { "desc": titleCase(doc.desc) }
});
counter++;
if (counter % 500 === 0) {
// Execute per 500 operations
bulk.execute();
// re-initialize every 500 update statements
bulk = db.collection.initializeUnorderedBulkOp();
}
})
// Clean up remaining queue
if (counter % 500 !== 0) { bulk.execute(); }
次の例では、deprecatedBulk()
APIため有する新しいMongoDBのバージョン3.2に適用され、を用いたAPIの新しいセットを提供bulkWrite()
。
MongoDBバージョン3。2以上:
var ops = [],
titleCase = function(str) {
return str.toLowerCase().split(' ').map(function(word) {
return word.replace(word[0], word[0].toUpperCase());
}).join(' ');
};
db.Books.find({
"title": {
"$exists": true,
"$type": 2
}
}).forEach(function(doc) {
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": {
"$set": { "title": titleCase(doc.title) }
}
}
});
if (ops.length === 500) {
db.Books.bulkWrite(ops);
ops = [];
}
})
if (ops.length > 0)
db.Books.bulkWrite(ops);
どのくらいのドキュメントですか?それほど多くない場合、単純なforEachとplain jsコードを使用することができます。 –