首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >聚合框架中的rmongodb $cond

聚合框架中的rmongodb $cond
EN

Stack Overflow用户
提问于 2013-07-12 05:12:35
回答 1查看 721关注 0票数 4

我正在尝试通过rmongodb中的操作在组中执行sum。我求和的“列”包含NaN值,导致我的sum返回NaN。在运行group by命令之前,我想使用$project将NaNs替换为零,但我被卡住了。

这将产生虚拟数据(在mongo控制台中):

代码语言:javascript
复制
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控制台中):

代码语言:javascript
复制
db.NAtest.aggregate( { $project : { y : 1, 
                                    x : { $cond : [ { $ne : ['$x', NaN] }, 
                                                    '$x', 
                                                    0] } } } )

这是我在R中的工作:

代码语言:javascript
复制
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以转换NaNs时,使用以下命令:

代码语言:javascript
复制
x = list("$cond" = c(list("$ne" = c("$x", as.numeric(NA))), "$x", "0"))

而不是

代码语言:javascript
复制
x = 1

不返回任何结果,mongo.get.err()返回值10,表示BSON无效。

如果在包含$cond部分的情况下在R会话中运行print(cmd),则会产生以下输出:

代码语言:javascript
复制
> 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替换为0时,我得到了相同的错误。

提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-09-02 16:49:28

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

在一个阶段中只尝试一个运算符。如果不可能,我可以推荐RMongo包作为替代。

代码语言:javascript
复制
dbAggregate(
    mongo, "db", '{
        $project : { 
            y : 1, 
            x : {$cond : [{ $ne : ['$x', NaN] }, '$x', 0]}
        }
}')
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17603616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档