Как считать с регулярным выражением в mongodb?
Допустим, у меня есть коллекция, документы которой выглядят как журнал доступа, что-то вроде
{
"_id" : ObjectId("599bd2ee7e50996104f2bc3e"),
"requesting_user" : "-",
"method" : "GET",
"size" : 0,
"remote_ip" : "49.35.22.166",
"timestamp" : ISODate("2017-08-19T10:59:04Z"),
"http_version" : "1.1",
"response_code" : "304",
"referrer" : "-",
"client" : "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/60.0.3112.78 Safari/537.36",
"request" : "/"
}
{
"_id" : ObjectId("599f08407e50992e2203e9da"),
"timestamp" : ISODate("2017-08-23T23:53:54Z"),
"response_code" : "200",
"referrer" : "https://www.dummysite.com/Pink-Easy-Baby-Blanket-and-Hat",
"requesting_user" : "173.89.22.74",
"remote_ip" : "173.89.22.74",
"client" : "Mozilla/5.0 (iPad; CPU OS 10_3_3 like Mac OS X) AppleWebKit/603.3.8 (KHTML, like Gecko) Version/10.0 Mobile/14G60 Safari/602.1",
"method" : "GET",
"http_version" : "2.0",
"size" : 18508,
"request" : "/baby-blanket-set/"
}
......
......
......
Я хочу посчитать по некоторому регулярному выражению, чтобы узнать, сколько посетителей из конкретной ОС. Так что для Windows я могу использовать регулярные выражения '/windows/gi'
, для Linux я могу использовать /linux/gi
и так далее в client
поле.
чтобы получить посетителей только из окон, я могу использовать структуру агрегации Монго, как
db.access_logs.aggregate([
{
'$match':{
'client':/windows/gi
}
},
{
'$group':{
'_id':null,
'windows':{
'$sum':1
}
}
}
])
или проще
db.access_logs.find({'client' : /windows/gi }).count()
Но как я могу посчитать эти случаи в mongodb, чтобы я получил результат что-то вроде
{
'windows' : 1234,
'linux' : 557
....
}