2014-01-17 59 views
0

如果我有以下players集合:獲取多個陣列的數量在相同的MongoDB查詢

> db.players.findOne() 
{ 
    _id: 1, 
    goals: ['goal_a', 'goal_b', 'goal_c'], 
    matches: ['match_a', 'match_b', 'match_c', 'match_d'] 
} 

是否有可能在MongoDB中編寫一個查詢將返回各自Array的計數,例如爲_id: 1

{ 
    _id: 1, num_goals: 3, num_matches: 4 
} 

我迄今爲止能夠利用獲得的計數爲Array S的一個aggregation pipeline

> db.players.aggregate(
     { $match: { '_id': 1 } }, 
     { $unwind: '$goals' }, 
     { $group: { _id:'player', num_goals: {$sum:1} } } 
) 

是否有可能擴充這個概念來算多Array s在相同的查詢?

謝謝:-)

回答

2

您的問題引起了我的興趣!我決定玩一下,這是可能的!儘管如此,仍然有點棘手。

使用多個$ groups和$ unwinds,您可以在管道中重塑文檔並使用它來獲得所需的輸出!這與你的文檔結構的工作 - - 我所測試的查詢如下:

> db.players.aggregate(
     {$match:{"_id":1}}, 
     {$unwind: "$matches"}, 
     {$group:{_id:"$_id",num_matches :{$sum:1},goals:{$first:"$goals"}}}, 
     {$unwind:"$goals"}, 
     {$group:{"_id":"$_id",num_matches:{$first:"$num_matches"},num_goals:{$sum:1}}} 
    ) 

它所做的是重複你已經發現了兩次,因爲我們正在處理兩列用簡單的加法步驟。在第二個$ group語句中,我包含了作爲第一個語句輸出結果一部分的匹配數量!

下面是輸出:

The output

希望這有助於!

+0

太好了,謝謝:-) – jabclab