2017-07-29 88 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/ –