具有条件的MongoDb总和列表

时间:2015-09-21 15:10:15

标签: mongodb mongodb-query

我有以下数据:

{ "_id" : ObjectId("55fbffbdebdbc43337b08946"), "date" : 1442578343617, 
    "body" : { "entries" : [ 
        { "url" : "google.com/randomString", "time" : 143.832}, 
        { "url" : "youtube.com/randomString", "time" : 170.128}, 
        { "url" : "google.com/randomString", "time" : 125.428} 
    ] } }

我想总结一下加载google.com网页所需的时间。

我想做的是:

    db.har.aggregate([
        {$match: {date: 1442578343617, "body.entries.url": /google/}},
        { $unwind : "$body.log.entries"}, 
        { $group : {"_id" : 123,"total" : {$sum:"$body.entries.time"}}}
    ])

但我得到的结果是总和:{ "_id" : 123, "total" : 439.388 }

如何按body.entries.url过滤?

非常感谢你的时间

2 个答案:

答案 0 :(得分:0)

在展开前按网址过滤会将包含的所有文档保留为Google网址。但它也会保留包含谷歌的文档的其他网址(在这种情况下:youtube)。因此,当您放松时,您仍然会拥有那些youtube网址并且永远不会过滤它们。

所以只是:

db.har.aggregate([
    {$match: {date: 1442578343617},
    {$unwind : "$body.log.entries"},
    {$match: {"body.entries.url": /google/},
    {$group: {"_id" : 123,"total" : {$sum:"$body.entries.time"}}}
])

答案 1 :(得分:0)

这里你正在展开错误的数组body.log.entries

您需要先按日期时间戳匹配来过滤掉文档,然后使用$ unwind并再次匹配body.entries.url,如:

db.collection.aggregate([{
    $match: {
    date: 1442578343617
    }
}, {
    "$unwind": "$body.entries"
}, {
    $match: {
    "body.entries.url": /google/
    }
}, {
    $group: {
    "_id": null, //you can use any other param here
    "total": {
        $sum: "$body.entries.time"
    }
    }
}])