我有以下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
执行此操作。
答案 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
而不是在单独的管道阶段,出于性能原因避免另一个管道传递。
$add
到Date
真正需要的唯一时间是在转换后的&#34;毫秒级的最终输出中#&ep;&#34; 值&#34;输出&#34;你想要BSON日期而不是数值的地方。