Java中的MongoDB聚合

时间:2018-10-23 22:07:05

标签: java mongodb

我正在尝试使MongoDB聚合在Java中工作。 Mongo文档(http://mongodb.github.io/mongo-java-driver/3.4/driver/tutorials/aggregation/)给出以下示例:

collection.aggregate(
      Arrays.asList(
              Aggregates.match(Filters.eq("categories", "Bakery")),
              Aggregates.group("$stars", Accumulators.sum("count", 1))
      )
).forEach(printBlock);

因此,我想他们是在“星星”字段上分组的,即,将面包店的“星星”值取为不同;多少个拥有一颗恒星,多少个具有一颗恒星,等等。我不明白在这种情况下什么是“计数”,我猜想结果字段的名称,例如在有那么多颗星星的面包店的“计数”中?但是我什至没有猜测sum()方法的第二个参数'1'。

我也想过滤,但是我想要取平均值而不是总和。 avg的文档看起来类似于sum,所以我想我将需要类似的声明。

Aggregates.group("reading", Accumulators.avg("average", ?));

那么我到目前为止有这个权利吗?那我的问号在哪里呢? mongo的avg文档讨论了“应用于每个值的表达式”,但是我不知道在这种情况下这意味着什么。我不希望对每个值应用任何内容,我希望将每个值添加到总计中,然后将其除以最后的值数。

1 个答案:

答案 0 :(得分:0)

  

我不明白在这种情况下“计数”是什么,我猜想结果字段的名称,就像有那么多星星的面包店的“计数”一样吗?

正确。在示例中,count$sum operator的结果字段的名称。本质上,这类似于:

{"$group": {
    "_id": "$stars", 
    "count" : {"$sum": 1 }
}}

这相当于说,在字段stars中创建一个不同值的列表,并计算每个值的出现次数。结果示例:

{ "_id" : 3, "count" : 100 }
{ "_id" : 2, "count" : 75 }
{ "_id" : 1, "count" : 50 }
  

我什至没有猜到sum()方法的第二个参数“ 1”。

说明每个值增加1;或指定表达式的结果中的数值

  

问号在哪里呢? mongo for avg文档讨论了“应用于每个值的表达式”

问号中的值是expression。例如,如果您指定将解析为字段值的field path expression,则$avg将汇总集合中所有文档的总字段值,然后将其除以字段数。例如:

Aggregates.group("reading", Accumulators.avg("average", "$field_with_numeric_value"));

另请参阅$avg operator behaviour