2017-09-14 91 views
0

后,我有这样的骨料:蒙戈DB总保持场

[ 
    { 
     $match: {_id: new ObjectId('xxx')} 
    }, 
    { 
     $unwind: "$users" 
    }, 
    { 
     $group: { 
      _id: '$users.status', 
      count: {$sum: 1} 
     } 
    }, 
    { 
     $project: { 
      name: 1, 
      field1: 1, 
      field2: 1, 
      count: '$count' 
     } 
    } 
] 

的模式:

{ 
    name: String, 
    field1: String, 
    field2: Schema.Types.Mixed, 
    users: [{ 
     user: { 
      type: Schema.Types.ObjectId, 
      ref: 'User' 
     }, 
     status: String 
    }] 
} 

预期的结果:

{ 
    name: 'NY', 
    field1: 'example', 
    field2: 'example2', 
    statuses: [ 
     { 
      _id: 'ONLINE', 
      count: 20 
     }, 
     { 
      _id: 'OFFLINE', 
      count: 120 
     }, 
     { 
      _id: 'OTHER', 
      count: 230 
     } 
    ] 
} 

这样,我得到组的结果只是为用户状态,而不是原始对象的其他字段。

+1

东西可以请你加什么你到底需要多一点的解释吗? – mrid

+0

您能否提供集合中文档的示例,以及如何让输出显示? – robjwilkins

+0

当然:我有城市文件,有城市和其他数据的名称,还有一组用户。我想要投影所有字段,并且还要按用户状态进行分组,并将其投影到 – user3712353

回答

0

使用$first保留字段,$push创建statuses数组。

$group作者:_id如果您的匹配包含单个objectId,则键是可选的。

[ 
    { 
    "$match": { 
     "_id": {_id: new ObjectId('xxx')} 
    } 
    }, 
    { 
    "$unwind": "$users" 
    }, 
    { 
    "$group": { 
     "_id": { 
     "_id": "$_id", 
     "status": "$users.status" 
     }, 
     "count": { 
     "$sum": 1 
     }, 
     "field1": { 
     "$first": "$field" 
     } 
    } 
    }, 
    { 
    "$group": { 
     "_id": "$_id._id", 
     "statuses": { 
     "$push": { 
      "_id": "$_id.status", 
      "count": "$count" 
     } 
     }, 
     "field1": { 
     "$first": "$field" 
     } 
    } 
    } 
]