2014-08-28 91 views
5

我想获取所有用户user_totaldocsuser_totalthings并想总和这些变量。查询和总结所有与猫鼬

怎么可能?下面是用户模式:

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

    } 
}); 

回答

12

可以使用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中添加。

一组null_id将传递到$group阶段的所有文档合并值,但你也可以在这里(由user_id如分组)使用其他标准。

4

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