我有一个收藏foo
:
{ "_id" : ObjectId("5837199bcabfd020514c0bae"), "x" : 1 }
{ "_id" : ObjectId("583719a1cabfd020514c0baf"), "x" : 3 }
{ "_id" : ObjectId("583719a6cabfd020514c0bb0") }
我使用这个查询:
db.foo.aggregate({$group:{_id:1, avg:{$avg:"$x"}, sum:{$sum:1}}})
然后我得到一个结果:
{ "_id" : 1, "avg" : 2, "sum" : 3 }
{$sum:1}
在此查询中的含义是什么?
3条答案
按热度按时间3duebb1j1#
从official docs:
在$group阶段中使用时,$sum具有以下语法,并返回通过将指定表达式应用于共享相同group by key的一组文档中的每个文档而得到的所有数值的总和:
{$总和:}< expression > }
因为在您的示例中表达式是
1
,所以它将为组中的每个文档聚合值1,从而得出每组的文档总数。bhmjp9jg2#
基本上,它会将每行的expression值相加。在本例中,由于行数为3,因此它将是1+1+1 =3。有关更多详细信息,请查看mongodb文档https://docs.mongodb.com/v3.2/reference/operator/aggregation/sum/
例如,如果查询为:
db.foo.aggregate({$group:{_id:1, avg:{$avg:"$x"}, sum:{$sum:$x}}})
那么和值将是1+3=4
nwnhqdif3#
我不知道6年前MongoDB的版本是什么,也不知道它是否有所有这些好东西,但似乎有理由认为
{$sum:1}
只不过是{$count:{}}
的一个黑客。事实上,这里的
$sum
比$count
更贵,因为它是作为一个额外的执行,而$count
更接近引擎。即使你不太给予性能,想想你为什么会问:因为这是一个不太明显的黑客攻击。我的选择是:
我刚刚在Mongo 5. 0. 14上试过这个,它运行得很好。
那句老话 “你能,并不意味着你应该。" 仍然存在,不是吗?