Mongodb:在聚集内将ISODate增加x天

时间:2018-12-25 22:28:00

标签: mongodb

我正在尝试在更复杂的mongodb聚合中将ISODate增加一天(此处未显示)。在这里,我尝试在mongo shell中设置一个简单的示例:

rs:PRIMARY> dts=new Date("2007-08-06T15:01:00Z")
ISODate("2007-08-06T15:01:00Z")
rs:PRIMARY> new Date({ 
...        $add: [{
...           "$subtract": [
...              "$dts", 
...              new Date("1970-01-01T00:00:00Z")
...           ]}, 
...           1000*60*60*24,
...        ]}
...     )
ISODate("0NaN-NaN-NaNTNaN:NaN:NaNZ")

在这里,我将输入日期/时间戳(标记为“ dts”)并从纪元(1970-01-01)中减去它。我验证了此结果给出了自大纪元以来的毫秒数(此处未显示)。

然后我将1天转换为毫秒(1000ms * 60s * 60min * 24小时),并将其添加到减法运算的结果中。对于此日期/时间戳记,这应产生自大纪元以来的毫秒数的长整数值:“ 2007-08-07T15:01:00Z”。因此,结果应与输入的dts值精确地相差一天。

通过一些实验,我发现问题可能出在某个地方,原因是我正在向新的Date()提供附加结果。但是,您将如何生成在此增加一天的ISODate?


关注评论

好吧,我意识到我可以在mongo shell中执行此操作以获得我想要的东西:

rs:PRIMARY> new Date((dts - new Date("1970-01-01T00:00:00Z") + 1000*60*60*24))
ISODate("2007-08-07T15:01:00Z")

但是我正试图将其放入一个更复杂的聚合表达式中,我相信您不能像在聚合表达式中一样使用JavaScript语法。所以我真的想弄清楚如何使用$ subtract和$ add来处理表达式。

1 个答案:

答案 0 :(得分:0)

我不确定如何在Mongo shell中进行演示,但是一种解决方案是使用$ toDate(v4.0中的新增功能)。

WebSocket {url: "ws://localhost:9000/", readyState: 0, bufferedAmount: 0, onopen: null, onerror: null, …}

请参阅$ toDate文档:

https://docs.mongodb.com/manual/reference/operator/aggregation/toDate/

此方法将根据需要在聚合内工作。