在mongodb中如何使用正则表达式计数?

在mongodb中如何使用正则表达式计数?,mongodb,access-log,Mongodb,Access Log,假设我有一个集合,它的文档看起来像访问日志,类似 { "_id" : ObjectId("599bd2ee7e50996104f2bc3e"), "requesting_user" : "-", "method" : "GET", "size" : 0, "remote_ip" : "49.35.22.166", "timestamp" : ISODate("2017-08-19T10:59:04Z"), "http_version" :

假设我有一个集合,它的文档看起来像访问日志,类似

{
    "_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,我可以使用regex
'/windows/gi'
,对于linux,我可以使用
/linux/gi
,等等,在
客户机
字段中

要从windows获得访客,我可以使用mongo的聚合框架,如

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
  ....

} 

老实说,帮你自己一个忙,更新所有数据以从字符串中提取此信息,并将其存储为文档上的另一个属性,即
os:'windows'
。如果您更新了所有数据,并确保所有新数据都是用相同的提取方式写入的,那么在这些数据上进行进一步的聚合要比用过于复杂的语句处理其他数据容易得多。整理好你的数据,让你的生活变得轻松。@NeilLunn你知道这个问题吗?或者我应该使用JavaScript来实现这一点?简而言之,“使用程序/脚本”。此外,我非常确定有几个库提供了一种方法来解析“客户机”字符串,并将其转换为具有明确属性(即操作系统、浏览器、版本)的对象。所以“如果是我”这样做,那么我会找到这样一个库并查看它生成的对象属性。然后使用它来读取和更新我拥有的数据,然后使用相同的库解析所有新日志文件并写入新数据,并对其他属性进行类似的分解。但这正是我要做的。老实说,帮你自己一个忙,更新所有数据以从字符串中提取此信息,并将其存储为另一个属性,即文档上的
os:'windows'
。如果您更新了所有数据,并确保所有新数据都是用相同的提取方式写入的,那么在这些数据上进行进一步的聚合要比用过于复杂的语句处理其他数据容易得多。整理好你的数据,让你的生活变得轻松。@NeilLunn你知道这个问题吗?或者我应该使用JavaScript来实现这一点?简而言之,“使用程序/脚本”。此外,我非常确定有几个库提供了一种方法来解析“客户机”字符串,并将其转换为具有明确属性(即操作系统、浏览器、版本)的对象。所以“如果是我”这样做,那么我会找到这样一个库并查看它生成的对象属性。然后使用它来读取和更新我拥有的数据,然后使用相同的库解析所有新日志文件并写入新数据,并对其他属性进行类似的分解。但我就是这么做的。