sql >> データベース >  >> NoSQL >> MongoDB

文字列値から空白(先頭と末尾)を削除する

    現在、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ファイルを更新してください。



    1. ubuntuのデフォルトポート6379とは異なるポートでredis-serverを起動する方法

    2. MongoDBにNOW()に相当するものはありますか

    3. SQLで複数の行をコンマ区切りリストに入れる方法

    4. redisでキーを複製します