我试图通过在r mongodb中的操作来执行组中的总和.我求和的“列”包含NaN值,导致我的总和返回NaN.我想在运行group by命令之前使用$project用零替换NaN,但是我被卡住了. 这将产生虚拟数据(在
这将产生虚拟数据(在mongo控制台中):
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})
这将产生所需的结果(在mongo控制台中):
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无效.
如果我在包含$cond部分的R会话中运行print(cmd),则会生成以下输出:
> 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
我不认为问题在于NaN / as.numeric(NA)部分代码,因为当我尝试替换时将数字2表示为零时,我得到相同的错误.
提前致谢.
看来rmongodb在聚合时无法真正处理嵌入其他运算符的运算符.在$group中使用$substr时遇到了同样的问题.在一个阶段中只尝试一个运算符.如果不可能,我可以推荐RMongo包作为替代方案.
dbAggregate( mongo, "db", '{ $project : { y : 1, x : {$cond : [{ $ne : ['$x', NaN] }, '$x', 0]} } }')