MongoDB $组聚合

时间:2018-02-08 13:25:06

标签: mongodb mongodb-query aggregation-framework aggregation

我有这样的集合

OrgName EmpId   Domain    Date
Google  12345   ABC   2017/01/01
Google  12345   XYZ   2017/02/01 
Google  67890   ABC   2017/03/01
Google  45678   ABC   2017/03/02
Yahoo   69875   HGF   2017/03/02
Google  45678   XYZ   2017/03/03
Google  45678   XYZ   2017/03/03
Google  12345   XYZ   2017/03/03
Google  12345   ABC   2017/03/04
Google  12345   ABC   2017/04/05

我需要获取具有最大"域"数量,并且必须在" ABC"和" XYZ"域GROUPBY OrgName明智。

我正在使用以下查询:

db.Collection1.aggregate([{ "$match" : { "$or" : [ { "Domain": "ABC"},{ "Domain": "XYZ"}]}},
{
    $group :{ "_id": {"OrgName" : "$OrgName", "EmpId" : "$EmpId",
        "Domain" : "$Domain"},
            count:{ $sum : 1 },
            "participantData" : { "$push" : { "EmpId" : "$EmpId" , "Domain" : "$Domain"}}}},
    {$sort:{"count":-1}},
     {$limit: 10}
],{ allowDiskUse: true })

在上面的示例中,期待结果:employee_id = 12345出现在" ABC"和" XYZ"域计数为5 (即12345.ABC = 3和12345.XYZ = 2)。

1 个答案:

答案 0 :(得分:1)

您可以尝试以下查询。

以下查询$group由OrgName,EmpId后跟$match来过滤参与者数组同时包含'ABC'和& 'XYZ`值。

$sort按计数过滤数据并输出前10个值。

db.collection.aggregate([
  {"$match":{"$or":[{"Domain":"ABC"},{"Domain":"XYZ"}]}},
  {"$group":{
    "_id":{"OrgName":"$OrgName","EmpId":"$EmpId"},
    "count":{"$sum":1},
    "participantData":{"$push":{"EmpId":"$EmpId","Domain":"$Domain"}}
  }},
  {"$match":{"participantData.Domain":{"$all":["ABC","XYZ"]}}},
  {"$sort":{"count":-1}},
  {"$limit":10}
])