查询 mongo 以检测时间序列中的值变化

xer*_*iee 3 mongodb mongodb-query aggregation-framework

我想知道在 MongoDB 中是否可以执行以下操作。

我收集了一些文档,这些文档代表了某个时间值的变化:

{
  "day" : ISODate("2018-12-31T23:00:00.000Z"),
  "value": [some integer value]
}
Run Code Online (Sandbox Code Playgroud)

数据中没有“漏洞”,我有某个时期内所有天数的条目。

是否可以查询此集合以仅获取与前一个值不同的文档(按天 asc 排序时)?例如,有以下文件:

{
      "day" : ISODate("2019-04-01T00:00:00.000Z"),
      "value": 10
},
{
      "day" : ISODate("2019-04-02T00:00:00.000Z"),
      "value": 10
},
{
      "day" : ISODate("2019-04-03T00:00:00.000Z"),
      "value": 15
},
{
      "day" : ISODate("2019-04-04T00:00:00.000Z"),
      "value": 15
},
{
      "day" : ISODate("2019-04-05T00:00:00.000Z"),
      "value": 15
},
{
      "day" : ISODate("2019-04-06T00:00:00.000Z"),
      "value": 10
}
Run Code Online (Sandbox Code Playgroud)

我想检索 2018-04-01、2018-04-03 和 2018-04-06 的文档。

我再次发布这个问题,因为前一个被错误地标记为重复。

Ale*_*lex 5

您需要获得成对的连续文档来检测差距。为此,您可以将所有文档推送到单个数组中,并将其压缩为从头部移动 1 个元素:

db.collection.aggregate([
    { $sort: { day: 1 } },
    { $group: { _id: null, docs: { $push: "$$ROOT" } } },
    { $project: {
        pair: { $zip: {
            inputs:[ { $concatArrays: [ [false], "$docs" ] }, "$docs" ]            
        } }
    } },
    { $unwind: "$pair" },
    { $project: {
        prev: { $arrayElemAt: [ "$pair", 0 ] },
        next: { $arrayElemAt: [ "$pair", 1 ] }
    } },
    { $match: {
         $expr: { $ne: ["$prev.value", "$next.value"] } 
    } },
    { $replaceRoot:{ newRoot: "$next" } }
])
Run Code Online (Sandbox Code Playgroud)

其余的都是微不足道的 - 您将数组展开回文档,比较对,过滤掉相等的对,并从剩下的替换根

  • 但是当然。如果我的问题正确,您只需将 `$group: {_id: null` 替换为 `$group: {_id: "$userId"` 即可。如果这不是您想要的,请提出一个带有正式数据片段和预期结果的正确问题。 (2认同)