使用mongo.code.create将数组参数构造为$ add

时间:2016-03-07 10:58:02

标签: mongodb rmongodb

我有以下MongoDB文档:

{"_id":{"$oid":"56d810f5c91e6779a38386b8"},
 "timestamp": {"$numberLong":"1457000674750"}}

我正在构建一个聚合管道,该管道应包含以下$project段:

{"$project": 
    {"date": {"$add": ["new Date(3600000)", "$timestamp"]}}
}   

这适用于MongoDB shell,但我无法使用rmongodb。例如,以下内容在我的管道中包含错误10(BSON无效):

mongo.bson.from.list(list(
"$project"= list("date"=list("$add"=list( mongo.code.create("new Date(3600000)"), "$timestamp")))
))

我很确定问题与代码(new Date(3600000))和/或它包含在数组中有关,而数组又是$add的参数。我想我可以用#34;旧方式构建BSON缓冲区",但我正在寻找的是如何使用mongo.bson.from.list和/或mongo.bson.from.JSON执行此操作。

1 个答案:

答案 0 :(得分:0)

如上所述,它不是" JavaScript代码"需要用来表示BSON注入日期,而不是语言环境中Date的原生格式。

所以在r中,你可以使用以下类型的构造函数来获取epoch的Date

as.POSIXct("1970-01-01",tz="GMT")

所以在对数值进行BSON日期转换并从中提取$year的示例中:

pipeline <- list(
  mongo.bson.from.list(list(
    '$project' = list(
      'test' =  list( '$year' = 
        list( '$add' = list (
          '$timestamp',
          as.POSIXct("1970-01-01",tz="GMT"),
          3600000
        ))
      )
    )
  ))
)

也就是说,没有什么可以阻止你直接将基本数学应用于数值,就像序列化符号的运算符示例一样:

{ "$project": {
    "test": {
        "$add": [
            { "$divide": [
                { "$subtract": [
                    { "$add": [ "$timestamp",3600000 ] },
                    { "$mod": [ 
                        { "$add": [ "$timestamp", 3600000 ] }, 
                        1000 * 60 * 60 * 24 * 365
                    ]}
                ]},
                1000 * 60 * 60 * 24 * 365
            ]},
            1970
        ]
    }
}}

还可以计算当前的&#34;年&#34;,同样的操作可以应用于日期的任何部分,无论是当前的&#34;年&#34; &#34; dayOfYear&#34;或任何东西。

另请注意,如果您打算使用$project,则不建议使用$group,因为您最好只使用&#34;转换&#34;直接进入分组_id而不是在单独的管道阶段,出于性能原因避免另一个管道传递。

$addDate真正需要的唯一时间是在转换后的&#34;毫秒级的最终输出中#&ep;&#34; 值&#34;输出&#34;你想要BSON日期而不是数值的地方。