使用日期和值从传感器中删除冗余数据

时间:2016-05-29 12:47:56

标签: mongodb mongoose mapreduce aggregation-framework

我正在开发一个从传感器收集数据的应用程序,我需要使用值(温度)和日期(时间戳)减少存储在mongodb数据库中的数据量

该文件具有以下格式:

{
 temperature: 10,
 timestamp: ISODate("2016-04-29T14:37:50.370Z")
 sensorCode:"SENSOR_A1"
}

问题在于传感器过于频繁地发送数据,所以在短时间内有太多的文件包含还原剂数据(比方说10分钟)。我的意思是在很短的时间内拥有多个相等的值是没有用的。 示例:此处有来自传感器的数据报告温度为10

 // collection: datasensors
    [
    {
     temperature: 10,
     timestamp: ISODate("2016-04-29T14:37:50.370Z")
     sensorCode:"SENSOR_A1"
    },
    {
     temperature: 10,
     timestamp: ISODate("2016-04-29T14:38:50.555Z")
     sensorCode:"SENSOR_A1"
    },
    {
     temperature: 10,
     timestamp: ISODate("2016-04-29T14:38:51.654Z")
     sensorCode:"SENSOR_A1"
    }
    ,
    {
     temperature: 10,
     timestamp: ISODate("2016-04-29T14:50:20.335Z")
     sensorCode:"SENSOR_A1"
    }
    ]

由于不需要细微的清理,我想删除所有文件,从2016-04-29T14:37:50.370Z到2016-04-29T14:38:51.32Z除外。所以结果应该是

 [
    {
     temperature: 10,
     timestamp: ISODate("2016-04-29T14:38:51.654Z")
     sensorCode:"SENSOR_A1"
    },
    {
     temperature: 10,
     timestamp: ISODate("2016-04-29T14:50:20.335Z")
     sensorCode:"SENSOR_A1"
    }
    ]

我想要执行的删除操作应该在不到10分钟的时间范围内“降低”相等的温度到一个值。

是否有任何技术可以实现这一目标?

1 个答案:

答案 0 :(得分:0)

我简化了我的解决方案,并决定在10分钟的时间窗口内保持收到的每个独特测量值 那个

需要Mongo 3.2
  1. 添加时间标记将在10分钟时间组中分开测量
  2. 然后我们保留组中的第一个记录并存储所有ID进一步处理
  3. 然后从所有id的数组中删除我们要保留的文档的id(让我们说要删除的文件)
  4. 最后,对于每个循环,我们删除不需要的ID - 此行已注释: - )
  5. 将下面的代码复制到mongo控制台,执行并验证要删除的ID,然后取消评论并转到GO!

    var addTimeMark = {
        $project : {
            _id : 1,
            temperature : 1,
            timestamp : 1,
            sensorCode : 1,
            yearMonthDay : {
                $substr : [{
                        $dateToString : {
                            format : "%Y%m%d%H%M",
                            date : "$timestamp"
                        }
                    }, 0, 11]
            }
        }
    }
    
    var getFirstRecordInGroup = {
        // take only first record froum group
        $group : {
            _id : {
                timeMark : "$yearMonthDay",
                sensorCode : "$sensorCode",
                temperature : "$temperature"
            },
            id : {
                $first : "$_id"
            },
            allIds : {
                $push : "$_id"
            },
            timestamp : {
                $first : "$timestamp"
            },
            totalEntries : {
                $sum : 1
            }
        }
    }
    
    var removeFirstIdFromAllIds = {
        $project : {
            _id : 1,
            id : 1,
            timestamp : 1,
            totalEntries : 1,
            allIds : {
                $filter : {
                    input : "$allIds",
                    as : "item",
                    cond : {
                        $ne : ["$$item", "$id"]
                    }
                }
            }
        }
    }
    
    db.sensor.aggregate([
            addTimeMark,
            getFirstRecordInGroup,
            removeFirstIdFromAllIds,
        ]).forEach(function (entry) {
        printjson(entry.allIds);
        // db.sensor.deleteMany({_id:{$in:entry.allIds}})
    })
    

    每个步骤后面的文档展望

    {
        "_id" : ObjectId("574b5d8e0ac96f88db507209"),
        "temperature" : 10,
        "timestamp" : ISODate("2016-04-29T14:37:50.370Z"),
        "sensorCode" : "SENSOR_A1",
       "yearMonthDay" : "20160429143"
    
    }
    

    2:

    {
        "_id" : {
            "timeMark" : "20160429143",
            "sensorCode" : "SENSOR_A1",
            "temperature" : 10
        },
        "id" : ObjectId("574b5d8e0ac96f88db507209"),
        "allIds" : [ 
            ObjectId("574b5d8e0ac96f88db507209"), 
            ObjectId("574b5d8e0ac96f88db50720a"), 
            ObjectId("574b5d8e0ac96f88db50720b")
        ],
        "timestamp" : ISODate("2016-04-29T14:37:50.370Z"),
        "totalEntries" : 3
    }
    

    和最后;

    {
        "_id" : {
            "timeMark" : "20160429143",
            "sensorCode" : "SENSOR_A1",
            "temperature" : 10
        },
        "id" : ObjectId("574b5d8e0ac96f88db507209"),
        "allIds" : [ 
            ObjectId("574b5d8e0ac96f88db50720a"), 
            ObjectId("574b5d8e0ac96f88db50720b")
        ],
        "timestamp" : ISODate("2016-04-29T14:37:50.370Z"),
        "totalEntries" : 3
    }