Mongoose $ group aggregation没有返回所需的结果

时间:2017-07-29 01:13:33

标签: node.js 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,因此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

的成员

1 个答案:

答案 0 :(得分:1)

假设每个sync(completionHandler: { [weak self] (success) -> Void in if success { self?.delegate?.amareUserDone() } }) 字段只能有一个队长,您可以根据队长条件将captain文档推送到阵列的第一个$$ROOTfiltering

$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"
}])