使用Ruby驱动程序的Mongo组查询

使用Ruby驱动程序的Mongo组查询,ruby,mongodb,Ruby,Mongodb,我有一个正在工作的Mongo查询,我需要将其转换为Ruby: var reducer = function(current, result){ result.loginsCount++; result.lastLoginTs = Math.max(result.lastLoginTs, current.timeStamp); } var finalizer = function(result){ result.lastLoginDate = new Date(resul

我有一个正在工作的Mongo查询,我需要将其转换为Ruby:

var reducer = function(current, result){
    result.loginsCount++;
    result.lastLoginTs = Math.max(result.lastLoginTs, current.timeStamp);
}

var finalizer = function(result){
    result.lastLoginDate = new Date(result.lastLoginTs).toISOString().split('T')[0];
}

db.audit_log.group({
     key : {user : true},   
     cond : {events : { $elemMatch : { action : 'LOGIN_SUCCESS'}}},
     initial : {lastLoginTs : -1, loginsCount : 0},
     reduce : reducer,
     finalize : finalizer
})
我在Ruby中遇到了几个关键问题。我对Mongo不是很熟悉,也不知道应该将什么作为参数传递给方法调用。在连接到数据库和名为audit_log的集合后,这是我的最佳猜测:

audit_log.group({
     "key" => {"user" => "true"},   
     "cond" => {"events" => { "$elemMatch" => { "action" => "LOGIN_SUCCESS"}}},
     "initial" => {"lastLoginTs" => -1, "loginsCount" => 0},
     "reduce" => "function(current, result){result.loginsCount += 1}",
     "finalize" => "function(result){ result.lastLoginDate = new Date(result.lastLoginTs).toISOString().split('T')[0]; }
})

或者类似的。我曾尝试使用Mongo文档使用一个更简单的聚合操作,但也无法实现。我只能得到非常简单的查询来返回结果。这些键(key、cond、initial等)是必需的,还是仅用于JavaScript?

这就是使用1.10.0 Mongo gem最终形成函数的方式:

@db.collection("audit_log").group(
  [:user, :events],
  {'events' => { '$elemMatch' => { 'action' => 'LOGIN_SUCCESS' }}},
  { 'lastLoginTs' => -1, 'loginsCount' => 0 },
  "function(current, result){ result.loginsCount++; result.lastLoginTs = Math.max(result.lastLoginTs, current.timeStamp);}",
  "function(result){ result.lastLoginDate = new Date(result.lastLoginTs).toISOString().split('T')[0];}"
)
使用Mongo驱动程序,您可以省去键:“key”、“cond”、“initial”、“reduce”、“finalize”,只需传入相应的值


我已经链接了其他SO用户采用的两种方法。

我在Github上找到了这个参考:这是一个Ruby Mongo Koans tdd教程,还有一个group()函数示例。因此,reduce和finalize方法作为包含JavaScript函数的字符串传递给Mongo。以下是教程中的一个示例:
@zips.group([:city],{},{'zsum'=>0,'zc'=>0,'avg_pop'=>0},'function(doc,out){out.zsum+=doc.population;out.zc+=1;},'function(out){out.avg_pop=out.zsum/out.zc}'