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 } }