我想要抓取所有用户user_totaldocs
和user_totalthings
,并希望汇总这些变量。
怎么可能?这是用户架构:
var user_schema = mongoose.Schema({
local : {
...
...
user_id : String,
user_totaldocs : Number,
user_totalthings : Number
....
}
});
答案 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
字段;我已添加totaldocs
和totalthings
作为计算多个字段的示例。
_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/