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

MongoDB:正規表現を使用してフィールドの名前を変更する方法

    _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()> サーバー上で処理するためですが、ドキュメントが示唆しているように、実際にはお勧めしません。必要な場合は注意して使用してください。



    1. Springデータ(動的フィールド)を使用したNull Pointer ExceptionMongoAggregationの取得

    2. Mongoskinを使用した各製品のフィールド説明の単語からMongoDBドキュメントを検索する

    3. MongoDB diacriticInSensitive検索では、すべてのアクセント付き(発音区別符号付きの単語)行が期待どおりに表示されない、またはその逆

    4. Spring DataMongoDBBigDecimalのサポート