現在、MongoDBの更新では、更新を適用するときに現在のフィールドの既存の値を参照することはできません。したがって、ループする必要があります:
db.collection.find({},{ "category": 1 }).forEach(function(doc) {
doc.category = doc.category.trim();
db.collection.update(
{ "_id": doc._id },
{ "$set": { "category": doc.category } }
);
})
$set
の使用に注意してください そこのオペレーターと、ネットワークトラフィックを削減するためにのみ予測される「カテゴリ」フィールド」
$regex
で処理するものを制限する場合があります 一致させる:
db.collection.find({
"$and": [
{ "category": /^\s+/ },
{ "category": /\s+$/ }
]
})
または、純粋な $regex
としても $and
を使用せずに これは、同じフィールドに複数の条件が適用されるMongoDBでのみ必要です。それ以外の場合は、 $and
すべての引数に暗黙的です:
db.collection.find({ "category": /^\s+|\s+$/ })
これにより、一致したドキュメントの処理が、先頭または末尾に空白があるドキュメントのみに制限されます。
表示するドキュメントの数が心配な場合、MongoDB 2.6以降を使用できる場合は、一括更新が役立つはずです。
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1 }).forEach(
function(doc) {
batch.push({
"q": { "_id": doc._id },
"u": { "$set": { "category": doc.catetgory.trim() } }
});
if ( batch.length % 1000 == 0 ) {
db.runCommand("update", batch);
batch = [];
}
}
);
if ( batch.length > 0 )
db.runCommand("update", batch);
または、MongoDB 2.6以降の一括操作APIを使用する場合でも:
var counter = 0;
var bulk = db.collection.initializeOrderedBulkOp();
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
bulk.find({ "_id": doc._id }).update({
"$set": { "category": doc.category.trim() }
});
counter = counter + 1;
if ( counter % 1000 == 0 ) {
bulk.execute();
bulk = db.collection.initializeOrderedBulkOp();
}
}
);
if ( counter > 1 )
bulk.execute();
最高 bulkWrite()
で実行 Bulk Operations API(技術的にはすべて)を使用する最新のAPIの場合 今はそうです)が、実際には安全に回帰する方法で 古いバージョンのMongoDBで。正直なところ、これはMongoDB 2.6より前のことを意味し、そのようなバージョンを使用した公式サポートオプションの対象外になります。このためのコーディングはややクリーンです:
var batch = [];
db.collection.find({ "category": /^\s+|\s+$/ },{ "category": 1}).forEach(
function(doc) {
batch.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "category": doc.category.trim() } }
}
});
if ( batch.legth % 1000 == 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
}
);
if ( batch.length > 0 ) {
db.collection.bulkWrite(batch);
batch = [];
}
これはすべて、一度サーバーに操作を送信するだけです。 1000ドキュメントあたり、または64MBのBSON制限内に収まる限り多くの変更。
問題に取り組むためのほんのいくつかの方法として。または、インポートする前にまずCSVファイルを更新してください。