【发布时间】:2020-07-18 22:14:33
【问题描述】:
我想找出每次 PresenceStatus 更改之间的停留时间。
示例集合 -
/* 1 */
{
"_id" : ObjectId("5e4889a7c7959f6a13039902"),
"presenceStatus" : 0,
"createdAt" : ISODate("2020-02-16T00:14:35.121Z"),
"updatedAt" : ISODate("2020-02-16T00:14:35.121Z"),
"__v" : 0
}
/* 2 */
{
"_id" : ObjectId("5e4889a7c7959f6a1303990c"),
"presenceStatus" : 1,
"createdAt" : ISODate("2020-02-16T00:15:35.121Z"),
"updatedAt" : ISODate("2020-02-16T00:15:35.121Z"),
"__v" : 0
}
/* 3 */
{
"_id" : ObjectId("5e4889a9c7959f6a1303995c"),
"presenceStatus" : 1,
"sensingTime" : ISODate("2020-02-16T00:15:37.000Z"),
"createdAt" : ISODate("2020-02-16T00:15:37.420Z"),
"updatedAt" : ISODate("2020-02-16T00:15:37.420Z"),
"__v" : 0
}
/* 4 */
{
"_id" : ObjectId("5e4889b0c7959f6a130399ff"),
"presenceStatus" : 1,
"createdAt" : ISODate("2020-02-16T00:15:44.316Z"),
"updatedAt" : ISODate("2020-02-16T00:15:44.316Z"),
"__v" : 0
}
/* 5 */
{
"_id" : ObjectId("5e4889b3c7959f6a13039a58"),
"presenceStatus" : 1,
"sensingTime" : ISODate("2020-02-16T00:15:47.000Z"),
"createdAt" : ISODate("2020-02-16T00:15:47.181Z"),
"updatedAt" : ISODate("2020-02-16T00:15:47.181Z"),
"__v" : 0
}
/* 6 */
{
"_id" : ObjectId("5e4889b5c7959f6a13039aad"),
"presenceStatus" : 1,
"sensingTime" : ISODate("2020-02-16T00:15:49.000Z"),
"createdAt" : ISODate("2020-02-16T00:15:49.545Z"),
"updatedAt" : ISODate("2020-02-16T00:15:49.545Z"),
"__v" : 0
}
/* 7 */
{
"_id" : ObjectId("5e4889b9c7959f6a13039b28"),
"presenceStatus" : 1,
"sensingTime" : ISODate("2020-02-16T00:15:53.000Z"),
"createdAt" : ISODate("2020-02-16T00:15:53.389Z"),
"updatedAt" : ISODate("2020-02-16T00:15:53.389Z"),
"__v" : 0
}
/* 8 */
{
"_id" : ObjectId("5e4889bcc7959f6a13039b78"),
"presenceStatus" : 1,
"sensingTime" : ISODate("2020-02-16T00:15:56.000Z"),
"createdAt" : ISODate("2020-02-16T00:15:56.007Z"),
"updatedAt" : ISODate("2020-02-16T00:15:56.007Z"),
"__v" : 0
}
/* 9 */
{
"_id" : ObjectId("5e4889bfc7959f6a13039c00"),
"presenceStatus" : 1,
"sensingTime" : ISODate("2020-02-16T00:15:59.000Z"),
"createdAt" : ISODate("2020-02-16T00:15:59.619Z"),
"updatedAt" : ISODate("2020-02-16T00:15:59.619Z"),
"__v" : 0
}
/* 10 */
{
"_id" : ObjectId("5e4889c2c7959f6a13039c4a"),
"presenceStatus" : 0,
"sensingTime" : ISODate("2020-02-16T00:16:02.000Z"),
"createdAt" : ISODate("2020-02-16T00:16:02.100Z"),
"updatedAt" : ISODate("2020-02-16T00:16:02.100Z"),
"__v" : 0
}
如您所见,第二个文档中的出席状态已从值 0 更改为 1。
我想记录这个dwell状态保持为1的时间段。(基本上status = 1到status = 0的时间差)
当它再次找到presenceStatus 1 并记录该数据块的presenceStatus 保持为1 的时间段时,相同的过程再次启动。
结果集合看起来像 -
{
"_id" : xxx
"occupiedTime" : ISODate("2020-02-16T00:15:35.121Z"), // *updatedAt* value of document 2, cause that's when it changed to 1.
"vacantTime" : ISODate("2020-02-16T00:16:02.100Z"), // *updatedAt* of document 10, because that's when status changed from 0 to 1.
"dwellTime" : (vacant time - occupied time in HH:MM:SS)
"created" : "2019-05-29 07:08:13",
"__v" : 0
}
感谢您的帮助。
【问题讨论】:
-
"07:00:53"是从哪里来的?我的意思是应该如何计算? -
我用更多细节更新了我的问题。 “07:00:53”基本上是从第一个文档中提取的时间值,当发现存在状态为1时。
-
不胜感激。
-
@newdeveloper:我猜这个日志记录发生在一个设备上?无论如何,对整个集合执行此操作是不可行的,您可能需要考虑对一天的数据或一个月的数据执行此操作,这也取决于每天积累多少文档以及它多久可以变为 0 的用例- 1 或反之亦然,因为如果设备在 5 个月内为 0,我们只能在 1 个月内执行此操作,因为我们将错过 4 个月的休息时间..
-
@whoami 这实际上是我们每天运行的数据聚合作业的一部分。记录发生在几个设备上,我必须找到一种方法来找到每个设备提到的停留时间。我正在一步一步地发布第一个问题,即每次值从 1 变为 0 时如何找到停留时间。
标签: mongodb mongoose mongodb-query aggregation-framework