Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/12.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
在java中动态创建组查询_Java_Mongodb - Fatal编程技术网

在java中动态创建组查询

在java中动态创建组查询,java,mongodb,Java,Mongodb,我有以下数据库: { stream :{ "name": "name1", "error1": 1, "error2": 1, "error3": 1 } } , { stream : {"name": "name1", "error1": 2, "error2": 1, "error3": 1 } } , { stream : {"name": "name2", "error1"

我有以下数据库:

  { stream :{ "name": "name1",
       "error1": 1,
       "error2": 1,
       "error3": 1 }
  }

,

{ stream : {"name": "name1",
       "error1": 2,
       "error2": 1,
       "error3": 1 }
  }

,
{ stream : {"name": "name2",
       "error1": 1,
       "error2": 1,
       "error3": 1 }
  }
我想把它的名字和总和,每次一些不同的错误组合

这就是我在mongo中所做的,我需要在java中动态创建以下查询

 db.collection.aggregate([{$group: {_id: "$stream.name",error1: {$sum:"$stream.error1"   },error2: {$sum: "$stream.error2" }}  ]) 
问题是每次我都需要不同的错误组合:错误1和错误2,只有错误1等等

这就是我所做的:if中的参数是我得到的一些布尔值

  List<String>  totalError = new ArrayList<String>();   
  BasicDBObject group = new BasicDBObject( "$group", new BasicDBObject("_id","$stream.name" ));


    if (error1)
    {

        group.append("error1",new BasicDBObject ("$sum", "$stream.error1"  ));

    }

    if (error2)
    {
        group.append("error2",new BasicDBObject ("$sum", "$stream.error2"  ));

    }

    if (error3)
    {
        group.append("error3",new BasicDBObject ("$sum", "$stream.error3"  ));

    }
},

而不是:

      { "$group" : { "_id" : "$stream.name", "error1" : { "$sum: "$stream.error1"} , "error2" : { "$sum" : "$stream.error2"}}
如果我知道我需要什么样的错误组合,我可以在组dbobject的构造函数中使用append。。但我不知道组合,我需要使用ifs

BasicDBObject fields = new BasicDBObject("_id","$stream.name" );
 if (error1)
    fields.append("error1",new BasicDBObject ("$sum","$stream.error1"));
 if (error2)
    fields.append("error2",new BasicDBObject ("$sum","$stream.error2"));
 if (error3)
    fields.append("error3",new BasicDBObject ("$sum","$stream.error3"));
BasicDBObject group = new BasicDBObject( "$group", fields);
如果可能,您应该使用帮助器函数

List<BsonField> fieldAccumulators = new ArrayList<>();
if (error1)
    fieldAccumulators.add(Accumulators.sum("error1","$stream.error1"));
if (error2)
    fieldAccumulators.add(Accumulators.sum("error2","$stream.error2"));
if (error3)
   fieldAccumulators.add(Accumulators.sum("error3","$stream.error3"));
collection.aggregate(Arrays.asList(Aggregates.group("$stream.name", fieldAccumulators)));

请现在就看。。我在mongoyou查看了我的查询,欢迎光临。我还添加了使用助手函数创建group stage的替代方法。
List<BsonField> fieldAccumulators = new ArrayList<>();
if (error1)
    fieldAccumulators.add(Accumulators.sum("error1","$stream.error1"));
if (error2)
    fieldAccumulators.add(Accumulators.sum("error2","$stream.error2"));
if (error3)
   fieldAccumulators.add(Accumulators.sum("error3","$stream.error3"));
collection.aggregate(Arrays.asList(Aggregates.group("$stream.name", fieldAccumulators)));