【问题标题】:Query and sum all with mongoose用猫鼬查询和求和
【发布时间】:2014-10-22 20:33:54
【问题描述】:

我想获取所有用户 user_totaldocsuser_totalthings 并希望sum这些变量。

这怎么可能?这是用户架构:

var user_schema = mongoose.Schema({
    local : {
        ...
        ...
        user_id          : String,
        user_totaldocs   : Number,
        user_totalthings     : Number
        ....

    }
});

【问题讨论】:

    标签: node.js mongodb express mongoose


    【解决方案1】:

    您可以使用 mongodb 提供的聚合框架。对于您的情况--

    如果您想获取整个集合中 user_totaldocs 的总和和 user_totalthings 的总和(意味着所有用户),请执行 --

    db.user_schemas.aggregate(
     [
      {
        $group : {
           user_id : null,
           user_totaldocs: { $sum: "$user_totaldocs"}, // for your case use local.user_totaldocs
           user_totalthings: { $sum: "$user_totalthings" }, // for your case use local.user_totalthings
           count: { $sum: 1 } // for no. of documents count
        }
      }
    ])
    

    对集合中特定用户的 user_totaldocs 和 user_totalthings 求和(假设一个用户有多个文档),这将返回每个用户的总和,DO --

    db.user_schemas.aggregate(
     [
      {
        $group : {
           user_id : "$user_id", 
           user_totaldocs: { $sum: "$user_totaldocs"}, // for your case use local.user_totaldocs
           user_totalthings: { $sum: "$user_totalthings" }, // for your case use local.user_totalthings
           count: { $sum: 1 } // for no. of documents count
        }
      }
    ])
    

    无需提供个人用户 ID。

    更多信息请阅读: 1.http://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group 2.http://docs.mongodb.org/manual/core/aggregation/

    【讨论】:

      【解决方案2】:

      您可以使用Aggregation Pipeline 将计算字段添加到结果中。下面有一些使用mongo shell 的示例,但Mongoose 的Aggregate() helper 中的语法类似。

      例如,要计算总和(每个用户文档),您可以在 $project stage 中使用 $add expression

      db.user.aggregate(
          // Limit to relevant documents and potentially take advantage of an index
          { $match: {
              user_id: "foo"
          }},
      
          { $project: {
              user_id: 1,
              total: { $add: ["$user_totaldocs", "$user_totalthings"] }
          }}
      )
      

      要计算多个文档的总数,您需要使用 $group stage$sum accumulator,例如:

      db.user.aggregate(
          { $group: {
              _id: null,
              total:       { $sum: { $add: ["$user_totaldocs", "$user_totalthings"] } },
              totaldocs:   { $sum: "$user_totaldocs" },
              totalthings: { $sum: "$user_totalthings" }
          }}
      )
      

      您可能只需要一个 total 字段;我在totaldocstotalthings 中添加了计算多个字段的示例。

      null 中的_id 组将组合传递到$group 阶段的所有文档中的值,但您也可以在此处使用其他条件(例如按user_id 分组)。

      【讨论】:

        猜你喜欢
        • 2013-07-07
        • 2012-02-03
        • 1970-01-01
        • 2020-06-02
        • 2021-12-21
        • 2021-03-23
        • 2018-02-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多