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

コレクション内のプロパティをマッピングするためのmap/reduceの使用

    OK、再帰を使用する必要があるため、これはもう少し複雑です。

    再帰を発生させるには、サーバーにいくつかの関数を格納できる必要があります。

    ステップ1:いくつかの関数を定義し、それらをサーバー側に配置します

    isArray = function (v) {
      return v && typeof v === 'object' && typeof v.length === 'number' && !(v.propertyIsEnumerable('length'));
    }
    
    m_sub = function(base, value){
      for(var key in value) {
        emit(base + "." + key, null);
        if( isArray(value[key]) || typeof value[key] == 'object'){
          m_sub(base + "." + key, value[key]);
        }
      }
    }
    
    db.system.js.save( { _id : "isArray", value : isArray } );
    db.system.js.save( { _id : "m_sub", value : m_sub } );
    

    ステップ2:マップを定義して関数を減らす

    map = function(){
      for(var key in this) {
        emit(key, null);
        if( isArray(this[key]) || typeof this[key] == 'object'){
          m_sub(key, this[key]);
        }
      }
    }
    
    reduce = function(key, stuff){ return null; }
    

    ステップ3:マップリデュースを実行して結果を確認する

    mr = db.runCommand({"mapreduce" : "things", "map" : map, "reduce" : reduce,"out": "things" + "_keys"});
    db[mr.result].distinct("_id");
    

    得られる結果は次のとおりです。

    ["_id", "_id.isObjectId", "_id.str", "_id.tojson", "egg", "egg.0", "foo", "foo.bar", "foo.bar.baaaar", "hello", "type", "type.0", "type.1"]
    

    ここに明らかな問題が1つあります。ここに、予期しないフィールドをいくつか追加しています:1。 _idデータ2。 .0(卵とタイプ)

    ステップ4:いくつかの可能な修正

    問題#1の場合 修正は比較的簡単です。 mapを変更するだけです 働き。これを変更します:

    emit(base + "." + key, null); if( isArray...
    

    これに:

    if(key != "_id") { emit(base + "." + key, null); if( isArray... }
    

    問題#2 もう少し危険です。 すべてが欲しかった キーと技術的には「egg.0」 有効なキー。 m_subを変更できます そのような数字キーを無視します。しかし、これが裏目に出る状況も簡単にわかります。通常の配列内に連想配列があるとし、その「0」を表示したいとします。その解決策の残りはあなたに任せます。



    1. redisが実行されているかどうかを確認します->ノードjs

    2. 本番用のMongoDBサーバーの準備

    3. Windowsでmongodbを起動する方法

    4. StackExchange.Redisで非同期コマンドとTask.WhenAnyが待機した後のタイムアウト例外