如何使用聚合计算MongoDB中两个日期之间的天数?我有一系列日期如下的排序项目。
<div id="svg54583"></div>
我想计算每个日期之间的天数(或时间)。 {
"date" : ISODate("2018-10-07T00:00:00.000Z"),
},
{
"date" : ISODate("2018-09-08T00:00:00.000Z"),
},
{
"date" : ISODate("2018-08-07T00:00:00.000Z"),
}
,item[0].date - item[1].date
等。最后一项没有日期。
结果应如下所示:
item[1].date - item[2].date
我想使用 {
"date" : ISODate("2018-10-07T00:00:00.000Z"),
"num_days": 29
},
{
"date" : ISODate("2018-09-08T00:00:00.000Z"),
"num_days": 32
},
{
"date" : ISODate("2018-08-07T00:00:00.000Z"),
"num_days": null
}
完成此操作。这可能吗?最好的方法是什么?
答案 0 :(得分:4)
请尝试此聚合管道
逻辑是$push
到数组的日期,使用$range
通过索引迭代数组,$map
使用$arrayElemAt
日期,通过$subtract
ing { {1}}索引并索引+1,然后除以$arrayElemAt
以得到毫秒数。
毫秒到天
86400000
管道
86400000 = 24*60*60*1000
输出
db.dt.aggregate([
{$group : {_id : null, dates : {$push : "$date"}}},
{$project : {dates : {
$map : {
input : {$range : [0, {$size :"$dates"}]},
as : "idx",
in : {
date : {$arrayElemAt : ["$dates", "$$idx"]},
days : {$divide: [{$subtract : [{$arrayElemAt : ["$dates", "$$idx"]}, {$arrayElemAt : ["$dates", {$sum : ["$$idx", 1]}]}]}, 86400000]}}}
}}},
{$unwind : "$dates"},
{$replaceRoot : {newRoot : "$dates"}}
]).pretty()
编辑
在过滤不需要的文档之前更安全地{ "date" : ISODate("2018-10-07T00:00:00Z"), "days" : 29 }
{ "date" : ISODate("2018-09-08T00:00:00Z"), "days" : 32 }
{ "date" : ISODate("2018-08-07T00:00:00Z"), "days" : null }
和$sort