2017-04-08 7 views
0

MongoDB集計関数をJava集計関数に変換しようとしています。mongoDB集約クエリをJava集約クエリに変換しようとしています

私のMongoDBのクエリは、私はJavaでの変換のために怒鳴るのコードを試してみました

[ 
{ 
    "$match": { 
    "indicesId": "VUSSTAPNETFF" 
    } 
}, 
{ 
    "$unwind": "$dataSets" 
}, 
{ 
    "$match": { 
    "dataSets.date": { 
     "$lte": ISODate("2013-12-31T18:30:00.000Z"), 
     "$gte": ISODate("2008-12-31T18:30:00.000Z") 
    } 
    } 
}, 
{ 
    "$group": { 
    "_id": "$indicesId", 
    "mean": { 
     "$avg": "$dataSets.data" 
    }, 
    "indices": { 
     "$push": "$$ROOT" 
    } 
    } 
}, 
{ 
    "$unwind": "$indices" 
}, 
{ 
    "$project": { 
    "_id": 1, 
    "mean": 1, 
    "firstResult": { 
     "$multiply": [ 
     { 
      "$subtract": [ 
      "$indices.dataSets.data", 
      "$mean" 
      ] 
     }, 
     { 
      "$subtract": [ 
      "$indices.dataSets.data", 
      "$mean" 
      ] 
     } 
     ] 
    } 
    } 
}, 
{ 
    "$group":{ 
     "_id":"", 
     "secondResult": { 
      "$avg": "$firstResult" 
     }, 
     "mean":{ 
      "$first": "$mean" 
     } 
    } 
}, 
{ 
    "$project":{ 
     "data":{ 
      "$sqrt":"$secondResult" 
     }, 
     "mean": "$mean" 
    } 
} 
] 

です。

BasicDBList subtractDBList= new BasicDBList(); 
subtractDBList.add("$indices.dataSets.data"); 
subtractDBList.add("$mean"); 

BasicDBList multiplyDBList= new BasicDBList(); 
multiplyDBList.add(new BasicDBObject("$subtract",subtractDBList)); 
multiplyDBList.add(new BasicDBObject("$subtract",subtractDBList)); 


Aggregation meanAggregation= Aggregation.newAggregation(Aggregation.match(Criteria.where(IndicesUtil.INDICES_ID).is(indicesId)), 
Aggregation.unwind(IndicesUtil.PREFIX+IndicesUtil.DATA_SETS), 
      Aggregation.match(Criteria.where(IndicesUtil.DATA_SETS_DATE).gte(startDate).lte(indicesDataSet.getDate())), 
      Aggregation.group(IndicesUtil.INDICES_ID).avg(averageParameter).as(IndicesUtil.MEAN).push("$$ROOT").as("indices"), 
      Aggregation.unwind(IndicesUtil.PREFIX+IndicesUtil.INDICES), 

      new AggregationOperation() { 

       @Override 
       public DBObject toDBObject(AggregationOperationContext arg0) { 
        return new BasicDBObject("$project", 
          new BasicDBObject("_id",1).append("mean", IndicesUtil.PREFIX+IndicesUtil.MEAN).append("firstResult", 
            new BasicDBObject("$multiply",multiplyDBList))); 


       } 
      }, 
      Aggregation.group().avg("$firstResult").as("secondResult").first(IndicesUtil.PREFIX+IndicesUtil.MEAN).as(IndicesUtil.MEAN), 
      new AggregationOperation() { 

       @Override 
       public DBObject toDBObject(AggregationOperationContext arg0) { 
        return new BasicDBObject("$project", 
          new BasicDBObject(IndicesUtil.DATA, 
            new BasicDBObject("$sqrt","$secondResult").append("mean", IndicesUtil.PREFIX+IndicesUtil.MEAN))); 

       } 
      } 



     ); 

私は

Invalid reference '$firstResult'! 

おかげで、事前に怒鳴るごとに怒鳴るライン

Aggregation.group().avg("$firstResult").as("secondResult").first(IndicesUtil.PREFIX+IndicesUtil.MEAN).as(IndicesUtil.MEAN), 

し、エラーの問題を取得しています。

答えて

0

1.10.1-Release spring mongoバージョンで集計を簡素化できます。 BasicDBObject/Documentは使用しないでください。春に提供されるヘルパーメソッドを使用してください。

Aggregation meanAggregation = Aggregation.newAggregation(
      Aggregation.match(Criteria.where(IndicesUtil.INDICES_ID).is(indicesId)), 
      Aggregation.unwind(IndicesUtil.PREFIX+IndicesUtil.DATA_SETS), 
      Aggregation.match(Criteria.where(IndicesUtil.DATA_SETS_DATE).gte(startDate).lte(indicesDataSet.getDate())), 
      Aggregation.group(IndicesUtil.INDICES_ID).avg(averageParameter).as(IndicesUtil.MEAN).push("$$ROOT").as("indices"), 
      Aggregation.unwind(IndicesUtil.PREFIX+IndicesUtil.INDICES), 
      Aggregation.project("_id", "mean").andExpression("(indices.dataSets.data - mean) * (indices.dataSets.data - mean)").as("firstResult"), 
      Aggregation.group().avg("$firstResult").as("secondResult").first(IndicesUtil.PREFIX+IndicesUtil.MEAN).as(IndicesUtil.MEAN), 
      Aggregation.project("mean").and("secondResult").sqrt().as(IndicesUtil.DATA) 
); 
関連する問題