2017-07-06 48 views
0

MongoDB的版本2.6.9总和的所有邮件发送

我试图计算总一公司已参与了短信互动。我能够使用汇总$组获得交互的一方,但是我基本上在查看两个字段并将它们汇总在一起以获得每个唯一的公司ID。

sender_idreceiver_id涉及相同的公司ID。

{ "_id" : a, "sender_id" : 1, "receiver_id" : 2, payload: "data" } 
{ "_id" : b, "sender_id" : 2, "receiver_id" : 5, payload: "data" } 
{ "_id" : c, "sender_id" : 2, "receiver_id" : 4, payload: "data" } 
{ "_id" : d, "sender_id" : 3, "receiver_id" : 2, payload: "data" } 
{ "_id" : e, "sender_id" : 4, "receiver_id" : 1, payload: "data" } 

使用上述的数据结构,我试图生产设置类似的结果到

{ "_id" : 1, count: 2} 
{ "_id" : 2, count: 4} 
{ "_id" : 3, count: 1} 
{ "_id" : 4, count: 2} 
{ "_id" : 5, count: 1} 

其中例如公司2参与消息A,B,C,d。

+0

显示您的聚合管道。 –

回答

1

您的选项在2.6管道中受到限制。你可以尝试下面的管道。

$group$pushsender_idreceiver_id创建单值数组。

$project$setUnion将ID合并成单个数组。

$unwind$group对发生次数进行计数。

db.collection.aggregate({ 
    "$group": { 
     "_id": "$_id", 
     "sender_id": { 
      "$push": "$sender_id" 
     }, 
     "receiver_id": { 
      "$push": "$receiver_id" 
     } 
    } 
}, { 
    "$project": { 
     "id": { 
      "$setUnion": ["$sender_id", "$receiver_id"] 
     } 
    } 
}, { 
    "$unwind": "$id" 
}, { 
    "$group": { 
     "_id": "$id", 
     "count": { 
      "$sum": 1 
     } 
    } 
}) 

对于较新的版本,您可以使用以下管道。使用[]来创建数组。

db.collection.aggregate({ 
    $project: { 
     id: ["$sender_id", "$receiver_id"] 
    } 
}, { 
    $unwind: "$id" 
}, { 
    $group: { 
     _id: "$id", 
     count: { 
      $sum: 1 
     } 
    } 
}) 
相关问题