2017-04-08 150 views
0

我想将MongoDB聚合函数转换为Java聚合函数。试图将mongoDB聚合查询转换为java聚合查询

我的MongoDB的查询是

[ 
{ 
    "$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" 
    } 
} 
] 

我试图娄代码在Java转换。

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))); 

       } 
      } 



     ); 

我收到问题波纹线

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

和错误按波纹管提前

Invalid reference '$firstResult'! 

感谢。

回答

0

你可以简化你在1.10.1-Release spring mongo版本上的聚合。你应该避免使用BasicDBObject/Document并使用spring提供的辅助方法。

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) 
);