【问题标题】:How to merge/join mongodb aggregate?如何合并/加入 mongodb 聚合?
【发布时间】:2015-06-09 23:13:55
【问题描述】:

鉴于此数据集:

db.calls.insert([{
  "agent": 2,
  "isFromOutside": true,
  "duration": 304
}, {
  "agent": 1,
  "isFromOutside": false,
  "duration": 811
}, {
  "agent": 0,
  "isFromOutside": true,
  "duration": 753
}, {
  "agent": 1,
  "isFromOutside": false,
  "duration": 593
}, {
  "agent": 3,
  "isFromOutside": true,
  "duration": 263
}, {
  "agent": 0,
  "isFromOutside": true,
  "duration": 995
}, {
  "agent": 0,
  "isFromOutside": false,
  "duration": 210
}, {
  "agent": 1,
  "isFromOutside": false,
  "duration": 737
}, {
  "agent": 2,
  "isFromOutside": false,
  "duration": 170
}, {
  "agent": 0,
  "isFromOutside": false,
  "duration": 487
}])

我有两个汇总查询,分别给出每个代理的总持续时间和每个客户的拨出电话计数:

退出GoingCalls 表:

db.calls.aggregate([
  { $match: {  duration :{ $gt: 0 }, isFromOutside: false } },
  { $group: { _id: "$agent", outGoingCalls: { $sum: 1 } } },
  { $sort: { outGoingCalls: -1 } }
])

获取 totalDuration 表:

db.calls.aggregate([
   { $group: { _id: "$agent", totalDuration: { $sum: "$duration" } } },
   { $sort: {totalDuration: -1 } }
])

如何合并/加入这些表(或只进行一次聚合)以获得类似的结果:

[
  {_id: 0, totalDuration: ..., outGoingCalls: ...},
  {_id: 1, totalDuration: ..., outGoingCalls: ...},
  {_id: 2, totalDuration: ..., outGoingCalls: ...},
  ...
]

【问题讨论】:

标签: mongodb


【解决方案1】:

试试下面的聚合框架:

db.calls.aggregate([    
    {
        "$group": {
            "_id": "$agent",
            "outGoingCalls": {
                "$sum": {
                    "$cond": [
                        { 
                            "$and": [
                                {"$gt": ["$duration", 0 ]},
                                {"$eq": ["$isFromOutside", false ]}
                            ]
                        },
                        1,
                        0
                    ]
                }
            },
            "totalDuration": { "$sum": "$duration" }
        }
    },
    { 
        "$sort": {
            "totalDuration": -1,
            "outGoingCalls": -1
        } 
    }
])

输出

/* 0 */
{
    "result" : [ 
        {
            "_id" : 0,
            "outGoingCalls" : 2,
            "totalDuration" : 2445
        }, 
        {
            "_id" : 1,
            "outGoingCalls" : 3,
            "totalDuration" : 2141
        }, 
        {
            "_id" : 2,
            "outGoingCalls" : 1,
            "totalDuration" : 474
        }, 
        {
            "_id" : 3,
            "outGoingCalls" : 0,
            "totalDuration" : 263
        }
    ],
    "ok" : 1
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2013-07-12
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 2017-09-03
    相关资源
    最近更新 更多