mongodb $sum:1在Mongo中是什么意思

aiqt4smr  于 2023-01-16  发布在  Go
关注(0)|答案(3)|浏览(224)

我有一个收藏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}在此查询中的含义是什么?

3duebb1j

3duebb1j1#

official docs
在$group阶段中使用时,$sum具有以下语法,并返回通过将指定表达式应用于共享相同group by key的一组文档中的每个文档而得到的所有数值的总和:
{$总和:}< expression > }
因为在您的示例中表达式是1,所以它将为组中的每个文档聚合值1,从而得出每组的文档总数。

bhmjp9jg

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

nwnhqdif

nwnhqdif3#

我不知道6年前MongoDB的版本是什么,也不知道它是否有所有这些好东西,但似乎有理由认为{$sum:1}只不过是{$count:{}}的一个黑客。
事实上,这里的$sum$count更贵,因为它是作为一个额外的执行,而$count更接近引擎。即使你不太给予性能,想想你为什么会问:因为这是一个不太明显的黑客攻击
我的选择是:

db.foo.aggregate({$group:{_id:1, avg:{$avg:"$x"}, sum:{$count:{}}}})

我刚刚在Mongo 5. 0. 14上试过这个,它运行得很好。
那句老话 “你能,并不意味着你应该。" 仍然存在,不是吗?

相关问题