【发布时间】:2015-10-17 04:24:16
【问题描述】:
我有如下结构的文档,其中每个数组元素包含“k”和“v”作为不同类型数据的键和值。我需要将“facility”、“ip”和“num”的“k”值组合起来,并计算集合中不同组合的总数。
{
"_id" : 1,
"logs" : [
{ "n" : "facility", "v" : 26 },
{ "n" : "num", "v" : 6 },
{ "n" : "ip", "v" : "137.68.151.104" },
{ "n" : "protocol", "v" : "55902/udp" },
{ "n" : "port", "v" : "53" }
]
},
{
"_id" : 2,
"logs" : [
{ "n" : "facility", "v" : 26 },
{ "n" : "num", "v" : 6 },
{ "n" : "ip", "v" : "137.68.160.51" },
{ "n" : "protocol", "v" : "13438/tcp" },
{ "n" : "port", "v" : "13438" }
]
},
{
"_id" : 3,
"logs" : [
{ "n" : "facility", "v" : 26 },
{ "n" : "num", "v" : 6 },
{ "n" : "ip", "v" : "137.68.160.51" },
{ "n" : "protocol", "v" : "13434/tcp" },
{ "n" : "port", "v" : "53" }
]
},
{
"_id" : 4,
"logs" : [
{ "n" : "facility", "v" : 26 },
{ "n" : "num", "v" : 6 },
{ "n" : "ip", "v" : "137.68.160.184" },
{ "n" : "protocol", "v" : "61662/udp" },
{ "n" : "port", "v" : "53" }
]
},
{
"_id" : 5,
"logs" : [
{ "n" : "facility", "v" : 26 },
{ "n" : "num", "v" : 6 },
{ "n" : "ip", "v" : "137.68.160.51" },
{ "n" : "protocol", "v" : "13435/tcp" },
{ "n" : "port", "v" : "13435" }
]
},
{
"_id" : 6,
"logs" : [
{ "n" : "facility", "v" : 26 },
{ "n" : "num", "v" : 6 },
{ "n" : "ip", "v" : "137.68.160.51" },
{ "n" : "protocol", "v" : "61662/udp" },
{ "n" : "port", "v" : "53" }
]
}
我不想要的查询选择条件是:
- 端口是 53
- 协议是“udp”或“tcp”
- 按 [facility, num, ip] 分组
那应该选择那里六个文档中的四个。那部分正在工作
我想要这样的结果。
{facility : 26, num : 6, ip : 137.68.151.104 , count : 1}
{facility : 26, num : 6, ip : 137.68.160.51 , count : 2}
{facility : 26, num : 6, ip : 137.68.160:184 , count : 1}
这是我目前所拥有的:
db.agg.aggregate ([
{
'$match' : { 'logs' : {'$all' : [{'$elemMatch' : {'n' : "port", "v" : "53"}}, {'$elemMatch' : {'n' : "protocol", "v" : {"$in" :[/udp/,/tcp/]}}} ]}} },
{ '$unwind' : '$logs' },
{ '$match' : {"logs.n" : "ip"}},
{ '$group' : { _id : { 'ip' : '$logs.v'}, count : {$sum : 1}}}
])
但我不知道如何获取其中的所有字段,而且我目前只得到“ip”的结果。
【问题讨论】:
标签: mongodb mongodb-query aggregation-framework