首页 > 解决方案 > Mongodb查询从最终结果中删除时间戳小于1秒的冗余字段

问题描述

我拥有的集合名称
1) 设备: _id、deviceId(string)、deviceInfo、companyId(string)

2) 手机: _id、companyId(string)、tagId(string)、mobileInfo

3) 跟踪: _id、DeviceID(string)、TagID(string)、trackInfo、Timestamp(在毫秒上)

我需要构建一个查询来获取给定 companyId 的所有跟踪数据(包括移动数据和设备数据)。每家公司都有:

  1. 一个或多个不同tagId的移动数据。
  2. 带有 deviceId 的一个或多个设备数据。
  3. 由 TagID 和 DeviceID 标识的一个或多个跟踪数据。

最终结果应包含列出的字段:DeviceID、deviceInfo、companyId、TagID、mobileInfo、trackInfo、Timestamp。
应用于查询的条件:
跟踪集合可以具有每秒的文档,在某些情况下所有字段都相同(时间戳不同 1 秒)。我不想要那些看起来多余的文档,为了实现这一点,我们可以使用条件为:如果最终结果的相邻行相同,有或没有它们的时间戳差异小于 1 秒,则其中一行不应该在最终结果上。我有工作查询,它​​将返回具有上述字段的文档,但是对于冗余行为,我在使用循环对查询返回的文档应用查询后检查了如下。现在,我需要在查询本身上实现以下逻辑。
注意:跟踪集合有数百万个文档,因此请注意可能影响性能的查询。

// grid is the array of documents returned by mongodb using query.
for (var k=1;k<grid.length;){
    var a=Number(grid[k].Timestamp);
    var b=Number(grid[k-1].Timestamp)
    if ((Math.abs(a - b)<(1000)) && grid[k].TagID===grid[k-1].TagID && grid[k].DeviceID===grid[k-1].DeviceID){
        grid.splice(k, 1);
    }
    else{
        k++;
    }
}

    
for (var k=1;k<grid.length-1;){
    if ((grid[k].DeviceID===grid[k-1].DeviceID && grid[k].TagID===grid[k-1].TagID) && (grid[k].DeviceID===grid[k+1].DeviceID && grid[k].TagID===grid[k+1].TagID)){
        grid.splice(k, 1);
    }
    else{
        k++;
    }
}

标签: javascriptnode.jsmongodbmongoose

解决方案


推荐阅读