2014-08-28 137 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/