javascript - 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 的所有跟踪数据(包括移动数据和设备数据)。每家公司都有:
- 一个或多个不同tagId的移动数据。
- 带有 deviceId 的一个或多个设备数据。
- 由 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++;
}
}
解决方案
推荐阅读
- android - SoundPool 加载失败
- json - 使用未知密钥反序列化 Json - ASP.Net Core 3.1
- angular - Workbox with Angular 12 Error: Can't find self.__WB_MANIFEST in your SW source
- c - 重新创建 strrchr() 但在字符串末尾获取额外字符
- c++ - 当 xml 源路径包含特殊字符(如表情符号)时,MSXML2::IXMLDOMDocument2Ptr load() 失败
- intellij-idea - 手动安装 Intellij azure-toolkit-for-intellij.jar 包含无效的插件描述符
- odoo-14 - 使用销售点在产品上显示数量
- odata - 无法使用 SAP Business Application Studio 将 Fiori 应用程序部署到系统
- ios - iOS WkWebView - 这种情况有什么区别?
- javascript - 如何在图表js中将点样式图例更改为菱形