Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mongodb 查找日期范围重叠的长度(以秒为单位)_Mongodb_Aggregation Framework - Fatal编程技术网

Mongodb 查找日期范围重叠的长度(以秒为单位)

Mongodb 查找日期范围重叠的长度(以秒为单位),mongodb,aggregation-framework,Mongodb,Aggregation Framework,假设我有一个文档,其中包含特定事件的开始/结束时间。使用MongoDB,我想确定给定另一个开始/结束时间的重叠(以秒为单位) 例如,我有以下现有文档: startTime:2018-02-06 12:36:33.000 endTime: 2018-02-06 12:59:04.000 然后,我想将其与开始时间2018-02-06 12:58:04.000和结束时间2018-02-06 15:59:04.000进行比较。我希望我的totalOverlappingUnseconds为60 有许多关

假设我有一个文档,其中包含特定事件的开始/结束时间。使用MongoDB,我想确定给定另一个开始/结束时间的重叠(以秒为单位)

例如,我有以下现有文档:

startTime:2018-02-06 12:36:33.000
endTime: 2018-02-06 12:59:04.000
然后,我想将其与开始时间
2018-02-06 12:58:04.000
和结束时间
2018-02-06 15:59:04.000
进行比较。我希望我的
totalOverlappingUnseconds
60


有许多关于如何确定日期是否重叠的示例()。但是如何获得它们重叠的秒数呢?

要获得差异,可以从两个集合中选择
end
值和
start
值。如果两个集合彼此不重叠,则会得到负值,因此在这种情况下可以再次使用赋值
0
。尝试:

let startTimeParam = ISODate("2018-02-06 12:58:04.000");
let endTimeParam = ISODate("2018-02-06 15:59:04.000");

db.col.aggregate([
    {
        $project: {
            seconds: {
                $let: {
                    vars: {
                        totalMs: {
                            $max: [
                                0,
                                { $subtract: [ { "$min": [ "$endTime", endTimeParam ] }, { $max: [ "$startTime", startTimeParam ] } ] }
                            ]
                        }
                    },
                    in: {
                        $divide: [ "$$totalMs", 1000 ]
                    }
                }
            }
        }
    }
])
用于定义临时变量并将毫秒转换为秒

下图说明了两组上所有可能的情况r表示将作为减法右侧的时间点,l表示减法左侧: