Mongoose $组聚合没有返回所需的结果

鉴于此会员资料:

{ _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,所以巴巴·波伊伊是他自己的队长,罗伯特是他和希瑟的队长

期望的结果

 { 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, } }, ]) 

我已经截断了一些数据的进一步过滤,因为这对我的问题并不重要

我得到了我想要的结果, 除了在结果中显示RIDER而不是CAPTAIN ,如下所示:

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

当我切换到使用$ last而不是$ first时,它会返回正确的结果,但我认为这只是因为在这个例子中的名称。 我想这个名字只显示有userType的成员:CAPTAIN

假设每个captain字段只能有一个船长,您可以按第一个$group$$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 } }