I have timeseries collection of documents that represent changes every 10 seconds.
{
timestamp: ISODate("2024-01-01T00:00:00.000Z"),
value: [some integer value]
}
The value most of the time would be 0, but there are some window time of value greater than 0.
{ timestamp: ISODate("2024-01-01T00:00:00.000Z"), value: 0 }
{ timestamp: ISODate("2024-01-01T00:00:10.000Z"), value: 0 }
{ timestamp: ISODate("2024-01-01T00:00:20.000Z"), value: 0 }
{ timestamp: ISODate("2024-01-01T00:00:30.000Z"), value: 0 }
{ timestamp: ISODate("2024-01-01T00:00:40.000Z"), value: 10 } <== first group openTime
{ timestamp: ISODate("2024-01-01T00:00:50.000Z"), value: 12 }
{ timestamp: ISODate("2024-01-01T00:01:00.000Z"), value: 27 }
{ timestamp: ISODate("2024-01-01T00:01:10.000Z"), value: 11 }
{ timestamp: ISODate("2024-01-01T00:01:20.000Z"), value: 3 }
{ timestamp: ISODate("2024-01-01T00:01:30.000Z"), value: 1 }
{ timestamp: ISODate("2024-01-01T00:01:40.000Z"), value: 0 } <== first group closeTime
{ timestamp: ISODate("2024-01-01T00:01:50.000Z"), value: 0 }
{ timestamp: ISODate("2024-01-01T00:02:00.000Z"), value: 0 }
{ timestamp: ISODate("2024-01-01T00:02:10.000Z"), value: 2 } <== second group openTime
{ timestamp: ISODate("2024-01-01T00:02:20.000Z"), value: 5 }
{ timestamp: ISODate("2024-01-01T00:02:30.000Z"), value: 1 }
{ timestamp: ISODate("2024-01-01T00:02:40.000Z"), value: 0 } <== second group closeTime
The goal is to restructure it to a better structured data and sum the data in between.
For example, I want to return the following structure
[
{
"openTime": "2024-01-01T00:00:40.000Z";
"closeTime": "2024-01-01T00:01:40.000Z";
"duration": 60000; // dateDiff between closeTime and openTime in ms
"consumption": 64; // sum of all first window group values
},
{
"openTime": "2024-01-01T00:02:10.000Z";
"closeTime": "2024-01-01T00:02:40.000Z";
"duration": 30000; // dateDiff between closeTime and openTime in ms
"consumption": 8; // sum of all second window group values
},
]
I wonder if it’s possible in MongoDB which I believe it does and I also wonder what’s the most optimized (and fastest) way to do so.
I’ve tried using prev and next values from this solution:
Query mongo to detect value changes in time series
Also tried $setWindowFields