2014-09-11 113 views
0

我有一个工作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文档进行更简单的聚合操作,但是我也无法使用它。我只能得到非常简单的查询来返回结果。这些键(键,cond,initial等)甚至是必需的,还是仅用于JavaScript?

+0

我在Github上找到了这个参考:这是一个Ruby-Mongo Koans tdd教程,并且有一个group()函数的例子。 https://github.com/chicagoruby/MongoDB_Koans/blob/master/koans/about_groups.rb 因此,reduce和finalize方法作为包含JavaScript函数的字符串传递给Mongo。下面是从教程的一个示例: '@ zips.group( [:城市], {},{ '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}')' – 2014-09-11 15:23:14

回答

0

这是怎样的功能终于初具规模使用1.10.0蒙戈宝石:

@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];}" 
) 

随着蒙戈驱动程序,你离开关键:“键”,“电导率”,“初步”, “减少”,“最终确定”并简单地传递相应的值。

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

相关问题