0

我有如下 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. 我想我可以用“旧方式”构建 BSON 缓冲区,但我正在寻找的是如何使用mongo.bson.from.listand/or来做到这一点mongo.bson.from.JSON

4

1 回答 1

0

如前所述,不是“JavaScript 代码”需要用于表示用于注入的 BSON 日期,而是Date在语言环境中用于表示 a 的任何本机格式。

所以在 中r,您可以使用以下类型的构造函数来获取Dateepoch:

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
        ]
    }
}}

还可以计算出当前的“年”,并且可以将相同类型的操作应用于日期的任何部分,无论是“dayOfYear”的当前“年”还是其他任何部分。

另请注意,$project如果您打算这样做,则不建议使用,因为出于性能原因,避免另一个管道通过$group,您最好将“转换”直接使用到分组_id中而不是在单独的管道阶段中。

唯一真正需要的时间是$add在“输出”中转换的“从纪元开始Date的毫秒”值的最终输出中,您需要 BSON 日期而不是数值。

于 2016-03-08T02:31:09.250 回答