MongoDB:如何使用聚合计算item [n]和item [n + 1]之间?

时间:2019-01-12 20:43:26

标签: mongodb

如何使用聚合计算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 } 完成此操作。这可能吗?最好的方法是什么?

1 个答案:

答案 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