2017-08-01 14 views
2

集計オブジェクトを使用してmongodbでのクエリをSpringデータMongoDbに変換しようとしています。集計クエリをmongodbからSpringデータMongoDbに変換できません

{ 
"_id" : ObjectId("596ce468798b61179c6442bb"), 
"_class" : "com.test.model.User", 
"name" : "Oi", 
"surName" : "Alo", 
"workLogs" : [ 
    { 
     "_id" : ObjectId("596ce468798b61179c6442bc"), 
     "day" : 1, 
     "month" : 1, 
     "year" : 2017, 
     "timeEntrance" : "8:00", 
     "lunchLeave" : "12:00", 
     "lunchBack" : "13:00", 
     "timeLeave" : "18:00" 
    }, 
    { 
     "_id" : ObjectId("596ce468798b61179c6442bd"), 
     "day" : 2, 
     "month" : 1, 
     "year" : 2017, 
     "timeEntrance" : "8:00", 
     "lunchLeave" : "12:00", 
     "lunchBack" : "13:00", 
     "timeLeave" : "18:00" 
    } 
    ] 
} 

私は同じ年と月であり、すべての作業ログを照会したいと思い、その後、私は結果として作業ログの唯一の配列を取得したいと思います:私は、モンゴで次の文書を持っています。

db.user.aggregate([ 
    {$unwind: '$workLogs'}, 
    {$match: {'workLogs.month':2, 'workLogs.year':2017}}, 
    {$group: {_id:'$_id', workLogs:{$push: '$workLogs'}}}, 
    {$project: {'_id':0, 'workLogs': 1}} 
]).pretty() 

しかし、私は春データMongoDBのにこのクエリを変換する方法を見つけることができない、私はほとんどそこだと思う、誰かが私を助けることができる場合、私は感謝:私はこのクエリを使用してモンゴでそれを行うために管理しました。ここで私はJavaで使用しているコードです。

Aggregation agg = Aggregation.newAggregation(
    unwind("workLogs"), 
    match(Criteria 
    .where("_id").is(userId) 
    .and("workLogs.month").is(1) 
    .and("workLogs.year").is(2017) 
    ), 
    group("_id"), 
    group("horarios") 
     .push(new BasicDBObject("workLogs", "workLogs")).as("workLogs"), 
    project("workLogs") 
); 

AggregationResults<WorkLog> results = mongoTemplate.aggregate(agg, "workLogs", WorkLog.class); 

ありがとうございました!

答えて

2

Javaコードに余分なフィールドがすべてある理由がわかりません。

シェルクエリのためのJavaの同等のコードを使用すると、$filterを使用するようにコードを簡素化することができ、また

Aggregation agg = Aggregation.newAggregation(
    unwind("workLogs"), 
    match(Criteria 
     .where("workLogs.month").is(1) 
     .and("workLogs.year").is(2017) 
    ), 
    group("_id").push("workLogs").as("workLogs"), 
    project("workLogs").andExclude("_id") 
); 

です。

import static org.springframework.data.mongodb.core.aggregation.Aggregation.newAggregation; 
import static org.springframework.data.mongodb.core.aggregation.Aggregation.project; 
import static org.springframework.data.mongodb.core.aggregation.ArrayOperators.Filter.filter; 
import static org.springframework.data.mongodb.core.aggregation.BooleanOperators.And.and; 
import static org.springframework.data.mongodb.core.aggregation.ComparisonOperators.Eq; 

Aggregation agg = newAggregation(project(). 
    and(
     filter("workLogs"). 
     as("workLog"). 
     by(
     and(
      Eq.valueOf("workLog.month").equalToValue(1), 
      Eq.valueOf("workLog.year").equalToValue(2017) 
    ) 
    ) 
    ).as("workLogs"). 
    andExclude("_id") 
); 
+0

ありがとうございました!最初のアプローチ(条件一致を使用)は魅力的に機能しました。 2番目の方法は機能しませんでした(フィルタを使用)、次の例外が発生しました:InvalidDataAccessApiUsageException:コマンドの実行に失敗しました:エラー[例外:無効な演算子 '$フィルタ']。 とにかく私の問題を解決するので、正しいと受け入れるつもりです:) – Evandro

+0

あなたは大歓迎です。 '$ filter'演算子はmongo 3.2バージョンから利用可能になりました。 – Veeram

関連する問題