我有以下数据:
{ "_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过滤?
非常感谢你的时间
答案 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"
}
}
}])