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

MONGODBのCSVでデータを分割してカウントするときに問題が発生しました(columnnameなどの列にNull値があります:)

    私は問題を発見したと思います。次の入力データを検討してください。

    {_id: 1, characters: ""}
    {_id: 2, characters: "a, b, c"}
    {_id: 3, characters: "a, b, c"}
    
    > db.collection.mapReduce(map, reduce, {out: { inline : 1}})
    "exception: reduce -> multiple not supported yet"
    

    このエラーメッセージは、現在MRを使用して値の配列を返すことができないことを示しています。リデュース機能を見てみると:

    reduce = function(key, values) {
        return values;
    }
    

    「values」は、キーでグループ化された「array.length」の配列になります。キー「a、b、c」が2回発行されたため(「」を含む複数のドキュメントに対して同じロジックが続きます)、値(私の例では)は2つの要素を持つ配列であり、MRは配列を返すことができません。

    特定のキーに対して単一のドキュメントが発行された場合(_id:1の場合)、reduce関数は呼び出されません。これは、ヌル文字を出力しないときにエラーメッセージが表示されない理由を説明しています。

    このMR操作を機能させるには、{characters:""}の単一のドキュメントを発行する必要があります。データに関する追加情報を提供すると、回避策を見つけるのに役立つ場合があります。

    編集:

    次のreduce関数は、配列ではなく単一の値が返されるようにします。

    reduce = function(key, values) {
            return values[0];
    }
    

    編集2:

    エラーを防ぐために、 "errmsg": "例外:マップの呼び出しに失敗しました:JSエラー:TypeError:this.charactersにはプロパティがありませんnofile_b:1"、 "code":9014 ...

    map = function() { 
        if (this.characters != null){ 
             var array = this.characters.split(','); 
             emit(this.characters, array.length);
        } 
    }
    



    1. SQLサーバーからMongoDBに移行する理由と反対の理由

    2. サブフィールドによるmongodbクエリ

    3. MongoDBの既存の値をインクリメントする方法

    4. アップサートによるMongodbの更新が失敗する