2016-05-24 5 views
1

私が持っている介して凝集の複数のアレイをカウントする方法:モンゴ:DBデータ以下に、JavaのmongoTemplate

{user : Tom, CORRECT: {q1, q3}, WRONG : {q2, q4} }, 
{user : jim, CORRECT: {q1}, WRONG : {q2, q3, q4} }, 
{user : Tom, CORRECT: {q6}, WRONG : {7} }, 

は、私は、ユーザーごとに各CORRECTの\ WRONG、すなわちのカウントを取得するために凝集を使用したいです

Aggregation agg = newAggregation(
      group("name"). 
        addToSet(correct).as(correct). 
        addToSet(wrong).as(wrong). 
        addToSet(partial).as(partial) 
    ); 

しかし、それぞれのユーザーのために、私は(データの完全なリストを取得:私が試したことはこれです

{user : Tom, correctCount : 3, wrongCount : 3}, 
{user : jim, correctCount : 1, wrongCount : 3}, 

すなわち、 q1、q2、q3 ...)、私はいつもそのリストでsize()を行うことができます - しかしそれは不可能です。代わりにカウント値を取得するにはどうすればよいですか?あなたはこれについて行くことができる

おかげ

答えて

0

一つの方法は、$projectパイプラインステップで$size演算子を使用して、これらの配列のサイズを有し、で、グループ文書の余分なフィールドを作成することです

モンゴシェル:

パイプラインは、新しいサイズのフィールドでカウントとして蓄積合計を取得します
db.collection.aggregate([ 
    { 
     "$project": { 
      "user": 1, 
      "correctSize": { "$size": "$CORRECT" }, 
      "wrongSize": { "$size": "$WRONG" } 
     } 
    }, 
    { 
     "$group": { 
      "_id": "$user", 
      "correctCount": { "$sum": "$correctSize" }, 
      "wrongCount": { "$sum": "$wrongSize" } 
     } 
    } 
]) 

のJava:$size expression

import static org.springframework.data.mongodb.core.aggregation.Expressions.*; //new 
... 
Aggregation agg = newAggregation(
    project("user") 
     .andExpression(expression("size", field("CORRECT"))).as("correctSize"); 
     .andExpression(expression("size", field("WRONG"))).as("wrongSize"); 
    group("user") 
     .sum("correctSize").as("correctCount") 
     .sum("wrongSize").as("wrongCount") 
); 
を使用するには、プロジェクト・ステップで
使用 SpEL andExpression