2017-12-08 21 views
3

私はMongoDBを初めて使いました。本当にありがとうございます。MongoDBは180レベルの入れ子を超えているため文書を挿入できません

MongoDBのJavaドライバ3.4.2を使ってmap/reduceを実行しようとしています。

は、私はそのようなこの1などの文書を持っているコレクションcollectionAを持っている:私はMyArrayというのすべての組み合わせを取得したいと思い

{ 
    "_id" : ObjectId("5a29a6757c5def07307a4b6f"), 
    "someProperty1" : "454545", 
    "someProperty2" : "1234", 
    "myArray" : [ 
     "1", 
     "2", 
     "3", 
    ] 
} 

:[1,2] [1,3] [2,1] [2,3] [3,1] [3,2]

最長のmyArrayには20個の要素があります。

私は、以下のものを使用して試してみた:

db.collectionA.mapReduce(
    function() { 
     var elem= this; 
     this.myArray.forEach(function (parent) { 
      elem.myArray.forEach(function (child) { 
       if (parent !== child) 
        emit(parent, child); 
       }); 
     }); 
    }, 

    function (key, values) { 
     return { 
      result: Array.from(new Set(values)) 
     }; 
    }, 
    { 
     query: { 
      $where: "this.myArray.length > 1" 
     }, 
     out: "collectionB" 
    }); 

私は少量のデータでそれをテストしたとき、それがうまく働きました。問題は今、ソースコレクションに2,150万のドキュメントがあり、この例外がスローされています。

例外スレッドで「プール-3-スレッド-5」 com.mongodb.MongoCommandException: サーバーのローカルホスト上で「それはをネストの180のレベルを超えているため、文書を挿入することはできません」 :コマンドがエラー15で失敗しました:27017。完全な応答は、 com.mongodbに「」、 「code」:15、「codeName」:「Overflow」}、「errmsg」: 「文書が180レベルの入れ子を超えているため挿入できません。 connection.ProtocolHelper.getCommandFailureException(ProtocolHelper.java:115) でcom.mongodb.connection.CommandProtocol.execute(CommandProtocol.java:114)

で私が間違って何をしているのですか?これにアプローチする正しい方法は何でしょうか?

ありがとうございます。

答えて

1

さて、私は、reduce関数の働きについて誤解を感じました。ほんの少しの運勢(または運の悪さ)によって少量のデータでうまく動作していました。私はemit(parent、{result:[child]})を送出するようmap関数を変更しました。 還元関数は次のようになります。

function (key, values) { 
    resultSet = new Set(); 
    values.forEach(function (partialResult) { 
     partialResult.result.forEach(function (elem) { 
      resultSet.add(elem); 
     }); 
    }); 
    return { 
     result: Array.from(resultSet) 
    }; 
} 

は魅力的です。

関連する問題