鉴于此会员数据:
{ _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,因此Baba Booey是他自己的队长,Robert是他自己和Heather的队长。
期望的结果
{ 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
的成员答案 0 :(得分:1)
假设每个sync(completionHandler: { [weak self] (success) -> Void in
if success {
self?.delegate?.amareUserDone()
}
})
字段只能有一个队长,您可以根据队长条件将captain
文档推送到阵列的第一个$$ROOT
和filtering:
$group
它给出了:
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"
}])