Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/355.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
正在尝试将mongoDB聚合查询转换为java聚合查询_Java_Mongodb_Spring Mongodb - Fatal编程技术网

正在尝试将mongoDB聚合查询转换为java聚合查询

正在尝试将mongoDB聚合查询转换为java聚合查询,java,mongodb,spring-mongodb,Java,Mongodb,Spring Mongodb,我正在尝试将MongoDB聚合函数转换为Java聚合函数 我的MongoDB查询是 [ { "$match": { "indicesId": "VUSSTAPNETFF" } }, { "$unwind": "$dataSets" }, { "$match": { "dataSets.date": { "$lte": ISODate("2013-12-31T18:30:00.000Z"), "$gte": ISO

我正在尝试将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'!

提前感谢。

您可以在
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)
 );