【问题标题】:How to query documents of last group occurrence in Mongo如何在Mongo中查询最后一组出现的文档
【发布时间】:2021-07-29 15:51:47
【问题描述】:

开发者视角的上下文

如果我的 Mongo 集合中的文档共享两个字段(我们称它们为“组”和“子组”)并且它们是连续的(这些组实际上是一个时间序列),则它们属于组。请注意,相同的“组”和“子组”组合有许多实现,它们是不同的组,因为它们不属于相同的时间序列。

是否可以查询最后一个时间序列,即所有文档(按时间戳降序)直到“组”或“子组”第一次更改值?

真实上下文

这是抽象的上下文;也许以真正的方式重新制定上下文可能会很有用。我收藏的文档是传感器测量值,“组”和“子组”标识了生产过程的类型。每个生产过程都重复了很多次,但从不连续。

我需要查询上一个生产过程的措施。

我目前的解决方案

我知道时间序列(生产过程)的最大持续时间是 n 秒,所以我用 python 查询了最后 n 秒并得到了最后一次出现'group' + 'subgroup' 使用 pandas。

【问题讨论】:

    标签: mongodb time-series grouping


    【解决方案1】:

    如果我们不是在谈论超大规模,那么您的方法似乎很好,但是如果您可以在最后 n 秒内拥有许多文档,我建议让数据库来完成繁重的工作。

    这是nodejs 驱动程序的代码示例:

    const nSecondsAgo = new Date(new Date().getTime() - 1000 * n);
    
    // get last document in db
    const lastDocument = await db.collection.findOne({
    timestamp: {$gt: nSecondsAgo}}, { sort: { timestamp: -1 } });
    
    // get last document in db from a different group/subgroup.
    const lastOtherGroupDocument = await db.collection.findOne({
        $or: [
            {group: {$ne: lastDocument.group}},
            {subgroup: {$ne: lastDocument.subgroup}}
        ],
        timestamp: { $gt: nSecondsAgo }
    }, {sort: {timestamp: -1}});
    
    // if no "other" document just use last N seconds as your start reference.
    const seriesStartTime = lastOtherGroupDocument?.timestamp ?? nSecondsAgo;
    
    //fetch results
    const seriesData = await db.collection.find({timestamp: {$gt: seriesStartTime $lte: lastDocument.timestamp})
    
    // or if it's possible data is still coming in:
    const seriesData = await db.collection.find({
            timestamp: {$gt: seriesStartTime},
            group: lastOtherGroupDocument.group,
            subgroup: lastOtherGroupDocument.subgroup
        },
    )
    

    如果您在timestamp 上建立一个递减索引并在group, subgroup, timestamp 上建立一个复杂索引,所有这些查询都将得到它的支持。并且查询时间应该是即时的。

    我会再说一遍,如果您没有从最后n 秒加载数万个文档,那么您当前的方法很好。只有当规模变得太大或您开始遇到性能问题时,我才建议您切换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-11
      • 2022-12-30
      • 2013-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多