无论如何,MongoDB聚合框架是否可用于汇总所有列或列数组而不仅仅是一列?
每行都有一个'类别ID'。我希望按特定的类别ID进行过滤,然后输出一行,即每列的总和。因为我不需要所有列,所以如果我可以指定列来提高性能会更好。
我已经看过使用1列完成此操作的示例,但不包含多列。
以下是示例数据
{ "type" : "A", "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
{ "type" : "A", "a" : 10, "b" : 20, "c" : 30, "d" : 40 }
{ "type" : "B", "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
{ "type" : "B", "a" : 10, "b" : 20, "c" : 30, "d" : 40 }
因此,当类型为B时,结果为
{ "type" : "B", "a" : 11, "b" : 22, "c" : 33, "d" : 44 }
可以看出,每个列都已经汇总,并返回一行,每列的总和。
我正在使用PHP和最新版本的MongoDB和Debian
由于
答案 0 :(得分:2)
我们没有您的数据作为一个明确的示例,但您似乎基本上在寻找$add
运算符"添加"一起提供的值列表。所以给出了一份文件样本:
{ "type" : "A", "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
{ "type" : "A", "a" : 10, "b" : 20, "c" : 30, "d" : 40 }
{ "type" : "B", "a" : 1, "b" : 2, "c" : 3, "d" : 4 }
{ "type" : "B", "a" : 10, "b" : 20, "c" : 30, "d" : 40 }
这个例子是"添加"所有"列"一起为" a"," b"和" c"只要。同样按"分组":
db.collection.aggregate([
{ "$group": {
"_id": "$type",
"total": { "$sum": { "$add": [ "$a", "$b", "$c" ] } }
}}
])
如果您不需要$add
或正在处理其他级别的数据,您也可以将$project
与$group
一起使用。
此数据的结果将是:
{ "_id" : "B", "total" : 66 }
{ "_id" : "A", "total" : 66 }
您实际要问的是,每列只需$sum
:
db.collection.aggregate([
{ "$group": {
"_id": "$type",
"a": { "$sum": "$a" },
"b": { "$sum": "$b" },
"c": { "$sum": "$c" },
"d": { "$sum": "$d" }
}}
])
产生:
{ "_id" : "B", "a" : 11, "b" : 22, "c" : 33, "d" : 44 }
{ "_id" : "A", "a" : 11, "b" : 22, "c" : 33, "d" : 44 }