2013-07-11 40 views
4

我想通过在rmongodb中的操作在组中执行一笔款项。我正在求和的“列”包含NaN值,导致我的总和返回NaN。我希望使用$ project在运行group by命令之前用零替换NaN,但我卡住了。

这将产生的虚拟数据(蒙戈控制台):

db.NAtest.insert({ y : 1, x : 1}) 
db.NAtest.insert({ y : 1, x : 2}) 
db.NAtest.insert({ y : 2, x : 3}) 
db.NAtest.insert({ y : 2, x : 4}) 
db.NAtest.insert({ y : 2, x : NaN}) 

这将产生期望的结果(在蒙戈控制台):

db.NAtest.aggregate({ $project : { y : 1, 
            x : { $cond : [ { $ne : ['$x', NaN] }, 
                '$x', 
                0] } } }) 

这是我在有工作R:

library(rmongodb) 
mongo <- mongo.create() 
buf <- mongo.bson.buffer.create() 
mongo.bson.buffer.append(buf, "aggregate", "NAtest"); 
mongo.bson.buffer.start.array(buf, "pipeline") 
mongo.bson.buffer.append.bson(buf, 
           "0", 
           mongo.bson.from.list(list('$project' = list(y = 1, 
                     x= 1)))) 
mongo.bson.buffer.finish.object(buf) 
cmd <- mongo.bson.from.buffer(buf) 

result <- mongo.command(mongo, "rmdb", cmd) 

当我尝试添加$ cond以转换NaN时,使用以下内容:

x = list("$cond" = c(list("$ne" = c("$x", as.numeric(NA))), "$x", "0")) 

代替

x = 1 

不返回的结果和mongo.get.err()返回的值10表明BSON是无效的。

如果我运行在R会话打印(CMD)时,包括$ COND部分,下面的输出产生:

> print(cmd) 
    aggregate : 2 NAtest 
    pipeline : 4  
      0 : 3  
        $project : 3  
          y : 1 1.000000 
          x : 3  
            $cond : 3   
              $ne : 4   
                0 : 2 $x 
                1 : 2 NA 

              : 2  $x 
              : 2  0 

我不认为问题在于与南/ as.numeric (NA)代码的一部分,因为当我尝试用零替换数字2时,我得到相同的错误。

在此先感谢。

+0

有这个查询同样的问题:查询<-mongo.bson.from.JSON(” { “$组”: { “_id”: “$创建”, “计数” :{ “$总和”:1}} } ') –

回答

0

似乎rmongodb在聚合时无法真正处理嵌入在其他运算符中的运算符。当在$group中使用$substr时,我遇到了同样的问题。

在舞台上只尝试一个操作符。如果这是不可能的,我可以推荐使用RMongo软件包。

dbAggregate(
    mongo, "db", '{ 
     $project : { 
      y : 1, 
      x : {$cond : [{ $ne : ['$x', NaN] }, '$x', 0]} 
     } 
}')