Как считать с регулярным выражением в 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
  ....

} 

0 ответов

Другие вопросы по тегам