2017-07-29 92 views
1

鑑於此會員資料:

{ _id: 1, userType: 'CAPTAIN', firstName: 'Robert', lastName: 'Reichert', captain: 1} 
{ _id: 2, userType: 'RIDER', firstName: 'Heather', lastName: 'Webre', captain: 1} 
{ _id: 3, userType: 'CAPTAIN', firstName: 'Baba', lastName: 'Booey', captain: 3} 

我想組的隊長一起,顯示了與每個隊長(即使是相關成員的計數船長本身)。 船長領域引用同一個集合中的_id,所以巴巴Booey是他自己的隊長,羅伯特是他自己和希瑟的隊長。

期望的結果

{ name: 'Baba Booey', count: 1 }, 
{ name: 'Robert Reichert', count: 2 } 

這裏的查詢:

Member.aggregate([ 
    { 
     $group: { 
     _id: { 
      captain: "$captain", 
     }, 
     ridersCount: { $sum: 1 }, 
     firstName: { "$first": "$firstName" }, 
     lastName: { "$first": "$lastName" }, 
     }, 
    }, 
    { 
     $sort: { lastName: 1, firstName: 1 } 
    }, 
    { 
     $project: { 
     _id: 1, 
     ridersCount: 1, 
     firstName: 1, 
     lastName: 1, 
     } 
    }, 
    ]) 

我已經被截斷的數據的一些進一步篩選,因爲這不是我的問題必要的)

我得到了重新sults我想,除了它顯示了騎手的結果,而不是隊長,像這樣:

{ name: 'Baba Booey', count: 1 }, 
{ name: 'Heather Webre', count: 2 } 

當我打開它使用$持續的,而不是$首先它返回正確的結果,但我認爲這只是因爲這個例子中的名字。我想的名字,只顯示成員誰擁有的用戶類型:CAPTAIN

回答

1

假設可以有每captain場只有1個隊長,你可以根據隊長條件的第一$groupfiltering陣列中推$$ROOT文件:

Member.aggregate([{ 
    $group: { 
     _id: { 
      captain: "$captain" 
     }, 
     ridersCount: { $sum: 1 }, 
     "data": { $push : "$$ROOT" } 
    }, 
}, { 
    $project: { 
     _id:0, 
     ridersCount:1, 
     data: { 
      $filter: { 
       input: "$data", 
       as: "item", 
       cond: { $eq: ["$$item.userType", "CAPTAIN"] } 
      } 
     } 
    } 
},{ 
    $unwind:"$data" 
}]) 

它提供:

{ "ridersCount" : 1, "data" : { "_id" : 3, "userType" : "CAPTAIN", "firstName" : "Baba", "lastName" : "Booey", "captain" : 3 } } 
{ "ridersCount" : 2, "data" : { "_id" : 1, "userType" : "CAPTAIN", "firstName" : "Robert", "lastName" : "Reichert", "captain" : 1 } } 
+0

感謝伯特蘭!這很好。我完全不熟悉$$ ROOT,但在這裏找到了一些很好的信息:https://docs.mongodb.com/manual/reference/operator/aggregation/group/ –