用mongoose查询和总结

时间:2014-08-28 21:02:54

标签: node.js mongodb express mongoose

我想要抓取所有用户user_totaldocsuser_totalthings,并希望汇总这些变量。

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

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

    }
});

2 个答案:

答案 0 :(得分:16)

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

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

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作为计算多个字段的示例。

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

答案 1 :(得分:5)

您可以使用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/