java - 在java中创建动态组查询

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

问题是,每次我都需要错误的不同组合:错误1和错误2,只有错误1等等。

这就是我所做的:(“if”中的参数是我得到的一些 boolean 值)

  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 的构造函数中使用追加。但我不知道组合,我需要使用“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)));

关于java - 在java中创建动态组查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48541506/

相关文章:

java - 如何在IntelliJ的模板语言中请求外部类?

javascript - 将自定义对象的 Mongoose PUT 实现到复杂模式中时出现问题

javascript - E11000重复键错误集合: Inserting document in mongodb

java - Java 中是否存在针对具有固定哈希长度的字符串的现成双向哈希函数?

java - URI.resolve() 不支持所有允许的文件名字符

node.js - Mongoose findOne({电子邮件 : email}) often works rarely doesn't work?

node.js - 如何使用 NodeJS 与 mongo Db 中的用户和给定记录关联

javascript - 从对象数组动态创建嵌套的 json

java - java中JSON的遍历

java - 使用 Spring 框架时如何 stub RabbitTemplate?