我正在尝试使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文档讨论了“应用于每个值的表达式”,但是我不知道在这种情况下这意味着什么。我不希望对每个值应用任何内容,我希望将每个值添加到总计中,然后将其除以最后的值数。
答案 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"));