【问题标题】:PHP MongoDB SUM all columnsPHP MongoDB SUM 所有列
【发布时间】:2014-07-10 02:41:47
【问题描述】:

有没有哪一种 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 }

可以看出,每一列都被求和了,单行返回每列的总和。

我在 Debian 中使用 PHP 和最新版本的 MongoDB

谢谢

【问题讨论】:

  • 您能否提供一个示例您的数据以及您想要的结果?请使用 JSON 格式。
  • 对不起,我的问题模棱两可......我已经更新了一个例子

标签: php mongodb mongodb-query aggregation-framework


【解决方案1】:

我们没有你的数据作为一个明确的例子,但你似乎基本上是在寻找$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" ] } }
    }}
])

如果您不需要$group 或正在处理不同级别的数据,也可以将$add 与$project 一起使用。

此数据的结果将是:

{ "_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 }

【讨论】:

  • 抱歉 .. 走开了 --- 但这看起来正是我所追求的......我现在将测试并让你知道......谢谢
  • 还应注意,上述解决方案似乎返回正常,但结果为空白
  • @user1641165 为我工作。你是如何在 PHP 中引用的?请注意,您需要像 '$a' 而不是会插值的 "$a" 之类的东西。
  • 是的......你是对的......你的解决方案确实有效......我犯了一个错误。我首先使用终端测试您的解决方案,因为它不是为 PHP 制作的。但是我只得到一个总数,我希望每列有 3 个总数
  • @user1641165 这就是示例对您的问题很重要的原因。这只是简单的$sum 聚合。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多