聚合框架中的 rmongodb $cond

Posted

技术标签:

【中文标题】聚合框架中的 rmongodb $cond【英文标题】:rmongodb $cond in aggregation framework 【发布时间】:2013-07-11 21:12:35 【问题描述】:

我正在尝试通过 rmongodb 中的操作在组中执行求和。我求和的“列”包含 NaN 值,导致我的总和返回 NaN。我想在按命令运行 group 之前使用 $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 时,我得到了同样的错误。

提前致谢。

【问题讨论】:

这个查询有同样的问题:query 【参考方案1】:

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

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

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

【讨论】:

以上是关于聚合框架中的 rmongodb $cond的主要内容,如果未能解决你的问题,请参考以下文章

R:“$addToSet”中的字段“$addToSet”对于存储无效:rmongodb

使用 rmongodb 和 plyr 将大型 MongoDB 集合传输到 R 中的 data.frame

rmongodb + 闪亮 --> 错误 15

r - rmongodb $or 查询构造

MongoDB 和 rmongodb。获取查找的大小而不是返回所有结果

rmongodb 没有为键返回不同的值