Python中的复杂Mongo查询

时间:2019-12-29 18:37:28

标签: python mongodb pymongo

我有一个名为measurements的收藏集。在此集合中,只有三个字段:id(唯一),tmstamp(唯一)和value。包含大于0的值的每一行都被视为警报。从零状态到下一个零状态发生的所有警报均被视为情节。我想查询数据,使其以情节格式返回。也就是说,每一行都是一集。

为了更容易理解,我举一个例子:

{"id":1, tmstamp:1577644027, value:0}
{"id":2, tmstamp:1577644028, value:0}
{"id":3, tmstamp:1577644029, value:1}
{"id":4, tmstamp:1577644030, value:1}
{"id":5, tmstamp:1577644031, value:2}
{"id":6, tmstamp:1577644032, value:2}
{"id":7, tmstamp:1577644033, value:3}
{"id":8, tmstamp:1577644034, value:2}
{"id":9, tmstamp:1577644035, value:1}
{"id":10, tmstamp:1577644036, value:0}
{"id":11, tmstamp:1577644037, value:1}
{"id":12, tmstamp:1577644038, value:1}
{"id":13, tmstamp:1577644039, value:1}
{"id":14, tmstamp:1577644040, value:0}

鉴于此数据,这些情节将是:

episode1

{"id":3, tmstamp:1577644029, value:1}
{"id":4, tmstamp:1577644030, value:1}
{"id":5, tmstamp:1577644031, value:2}
{"id":6, tmstamp:1577644032, value:2}
{"id":7, tmstamp:1577644033, value:3}
{"id":8, tmstamp:1577644034, value:2}
{"id":9, tmstamp:1577644035, value:1}

episode2

{"id":11, tmstamp:1577644037, value:1}
{"id":12, tmstamp:1577644038, value:1}
{"id":13, tmstamp:1577644039, value:1}

我的问题是:是否有任何方法可以在Mongo中查询数据以获取这种格式的结果,而无需在查询本身之后执行这些操作?

1 个答案:

答案 0 :(得分:2)

您需要结合使用$facetArray expression operators
正如 @aws_apprentice 所述,如果您以前知道{strong>零状态度量ID为boundaries don't accepts expresions$bucket会为您完成此操作。

因此,我们需要分离零状态和非零状态数据。我们称它们为:警报(值= 0)和情节(值> 1)。
对于alerts,我们将每个带有警报的度量_id存储到数组中(我们需要它来过滤情节)。使用$indexOfArray$arrayElemAt,我们可以获取下一个_id i+1 (过滤 i { {1}} ID)。

假设

我已将i+1替换为id以进行汇总
您知道如何使用_id语法翻译MongoDB聚合命令

Python

MongoPlayground

相关问题