在java中创建动态组查询

时间:2018-01-31 11:52:25

标签: java mongodb

我有以下数据库:

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

事情就是每次我需要不同的错误组合:error1和error2,只有错误1等。

这就是我所做的:(&#34中的参数; 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"}

},

而不是:

      { "$group" : { "_id" : "$stream.name", "error1" : { "$sum: "$stream.error1"} , "error2" : { "$sum" : "$stream.error2"}}

如果我知道我需要什么错误组合,我可以在组dbobject的构造函数中使用append ..但我不知道组合,我需要使用&#34; ifs&#34;

1 个答案:

答案 0 :(得分:1)

尝试

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