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

ドキュメント内の文字列を効率的に検索して置換する

    確かに、あなたがしたいのが を取り除くことだけなら テキストからエンティティを取得し、グローバル一致を実行して置換します:

    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も使用します 複数行の場合、「名前」文字列には改行文字が含まれます。基本的なregexerの例 を参照してください。 。

    $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更新ステートメントがこのように更新式の一部として既存の値を使用する方法はないため、ループするしか方法はありませんが、示されているように操作を減らすために多くのことを行うことができます。



    1. MongoDB:配列内のアイテムの数をカウントします

    2. MongoDBでインデックスを作成する3つの方法

    3. MongoDBAtlas接続エラーがサーバーに接続できませんでした...

    4. MongoDBアップサートが挿入または更新を行ったかどうかを確認します