2017-03-07 2 views
1

mongo 3.0.4を使用してデータをキーでグループ化しています。私はキーの「名前」で集計しmongoアグリゲートパイプラインで、サム演算子を使用するときにnullと0を区別する方法

[ 
{ 
    '$group': { 
     '_id': '$name', 
     'a': { 
      '$sum': '$a' 
     }, 
     'b': { 
      '$sum': '$b' 
     }, 
     'c': { 
      '$sum': '$c' 
     } 
    } 
} 
] 

以下のコードを使用して、すべてのA、B、Cの各フィールドを合計などの結果を取得しようと、我々は

{'a': 1, 'b': 2, 'name': 'leo'} 
{'a': 1, 'b': 2, 'name': 'leo'} 
{'a': 2, 'b': 2, 'c': 0, 'name': 'amy'} 
{'a': 2, 'b': 2, 'c': 0, 'name': 'amy'} 

のようないくつかのmongo書類を持っていると仮定その

[ 
{ 
    '_id': 'leo', 
    'a': 2, 
    'b': 4, 
    'c': 0 
}, 
{ 
    '_id': 'amy', 
    'a': 4, 
    'b': 4, 
    'c': 0 
} 
] 

質問はグループleoの "c"フィールドも0で、私はnullであると予想しています。 と期待される結果は、私が$sumオペレータ扱い0としてなしの数値フィールドを知っている

[ 
{ 
    '_id': 'leo', 
    'a': 2, 
    'b': 4, 
    'c': null 
}, 
{ 
    '_id': 'amy', 
    'a': 4, 
    'b': 4, 
    'c': 0 
} 
] 

または

[ 
{ 
    '_id': 'leo', 
    'a': 2, 
    'b': 4 
}, 
{ 
    '_id': 'amy', 
    'a': 4, 
    'b': 4, 
    'c': 0 
} 
] 

する必要がありますので、それを行うための任意の方法はありますか?合計演算子を使用する場合、nullと0を総計で区別するにはどうすればよいですか?

+0

これは単一クエリでは達成できないと思います。あなたは2つにあなたのクエリを分割する必要があります。 –

+0

1つのパイプラインで達成できる可能性はありますか?一致を使用するような、プロジェクト... –

答えて

1

私はこれがあなたのために

db.gg.aggregate([{ 
      '$group': { 
       '_id': '$name', 
       'a': { 
        '$sum': '$a' 
       }, 
       'b': { 
        '$sum': '$b' 
       }, 
       'c': { 
        '$sum': '$c' 
       }, 
       cdata: { 
        $push: { 
         c: "$c" 
        } 
       } 
      } 
     }, 

     { 
      $project: { 
       _id: 1, 
       a: 1, 
       b: 1, 
       c: { 
        $cond: [{ 
         $eq: [{ 
          $setIsSubset: [ 
           [{}], "$cdata" 
          ] 
         }, true] 
        }, null, "$c"] 
       } 
      } 
     } 
    ]) 

を助けるかもしれ出力、これを試してみました:

 { "_id" : "amy", "a" : 4, "b" : 4, "c" : 0 } 
    { "_id" : "leo", "a" : 2, "b" : 4, "c" : null } 
+0

助けてくれてありがとう、$プッシュはこの場合に便利です、唯一の問題は、ドキュメントが非常に大きいかもしれないということです、そして、私は$プッシュを使用することがパフォーマンスに影響するかもしれないことを恐れています。とにかくその良いアイデア、ありがとう –

0

最終的に私はこの

[ 
{ 
    '$project': { 
     'a': 1, 
     'b': 1, 
     'c': 1, 
     'c_count': { 
      '$cond': [ 
       {'$gt': ['$c', null]}, 
       1, 
       0 
      ] 
     } 
    } 
}, 
{ 
    '$group': { 
     '_id': '$name', 
     'a': { 
      '$sum': '$a' 
     }, 
     'b': { 
      '$sum': '$b', 
     }, 
     'c': { 
      '$sum': '$c' 
     }, 
     'c_count': { 
      '$sum': '$c_count' 
     } 
    } 
}, 
{ 
    '$project': { 
     'a': 1, 
     'b': 1, 
     'c': { 
      '$cond': [ 
       '$c_count', 
       '$c', 
       null 
      ] 
     } 
    } 
} 
] 

は、最初のプロジェクトは、ドキュメントを把握することができましたbson-sort-orderのヌルフィールドが低いため、フィールドc、 が含まれています。その後、次のパイプラインでヌルと0を消化することが可能です

関連する問題