聚合框架中的rmongodb $cond

前端之家收集整理的这篇文章主要介绍了聚合框架中的rmongodb $cond前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图通过在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',0]}
        }
}')

猜你在找的设计模式相关文章