Mongodb Mongo db$组动态表达式

Mongodb Mongo db$组动态表达式,mongodb,aggregation-framework,Mongodb,Aggregation Framework,我有一组带有时间戳的日志,需要通过一些不存在的“虚拟会话”对这些日志进行分组 如果上一个会话中的最后一个日志与此会话中的第一个日志之间有半小时的时间,则新分组会话开始 例如,我们有以下一组数据: [ { id: "b4f0d0d7-495b-48db-95bf-d5ac0c8c9e9b" time: 1461872894322 timestamp: "Apr 28, 2016 7:48:14 PM", }, { id: "bf55ca2f-b544-406c-be

我有一组带有时间戳的日志,需要通过一些不存在的“虚拟会话”对这些日志进行分组

如果上一个会话中的最后一个日志与此会话中的第一个日志之间有半小时的时间,则新分组会话开始

例如,我们有以下一组数据:

[
{
    id: "b4f0d0d7-495b-48db-95bf-d5ac0c8c9e9b"
    time: 1461872894322
    timestamp: "Apr 28, 2016 7:48:14 PM",
},
{
    id: "bf55ca2f-b544-406c-bed6-766a1204683d"
    time: 1461872937941
    timestamp: "Apr 28, 2016 7:48:57 PM"
},
{
    id: "7f2ab420-0434-46f8-9444-6e2ffa73aea8"
    time: 1461873088155
    timestamp: "Apr 28, 2016 7:51:28 PM"
},
{
    id: "dd31124c-0375-454a-acca-c239465a2b22"
    time: 1461839257257
    timestamp: "Apr 28, 2016 10:27:37 AM"
},
{
    id: "a4370974-bfea-408f-aa69-973961e9f058"
    time: 1461839281324
    timestamp: "Apr 28, 2016 10:28:01 AM"
}
]
它应该分组在两个虚拟会话中。作为分组的结果,我可以在mongo aggregate$group中获得每个组的最小和最大时间,但是如何编写正确的表达式呢

预期的答案是

[
{min: 1461872894322, max: 1461873088155},
{min: 1461839257257, max: 1461839281324}
]

不幸的是,mongo查询无法做到这一点,因为上一行(如CTE公共表表达式)没有句柄

要解决这个问题,您需要在客户端处理数据(或者在mongo控制台中使用javascript—就像来自sql world的SP一样),并遍历所有文档,检查时间间隔,并向集合添加分组指示符。 然后,您将能够通过添加的分组指示符进行分组

考虑起诉$let,因为它可以访问外部变量-但这是RO访问,所以我们不能依赖它

玩得开心! 欢迎任何意见