使用timestamp mongodb

时间:2017-08-22 12:25:35

标签: javascript node.js mongodb api

我想替换sensor.reading == null语句。用一个语句检查以前的时间戳 以及检查所有传感器是否已推送数据的新时间戳。 我想通过检查时间戳来检查传感器是否没有将任何数据推送到数据库。 但我不知道如何在javascript中执行此操作,因为它是异步的。我在db中有一个传感器表,它也有一个时间戳。我使用mongodb作为DBMS。这是在JavaScript中。

http.get('http://localhost:3000/stream', function (res) {
var body = '';

//Start of request
res.on('data', function (chunk) {
    body += chunk;
});

var query = sensorManager.find({});
query.exec(function (err, sensors) {
    if (err) return handleError(err);
    check = sensors;
});


//End of request
res.on('end', function () {
    var data = JSON.parse(body);

    check.forEach(function (status) {
        data.forEach(function (sensor) {
            if (sensor.sensor_id == status.sensor_id && sensor.sensor_type == status.sensor_type) {
                if (sensor.reading == null) {
                    var options = {
                        uri: 'http://localhost/api/nodemanager/' + status._id,
                        method: 'PUT',
                        headers: {
                            'Content-Type': 'application/json'
                        },
                        json: {"interval": status.interval + 1}
                    };
                    request(options, function (error, response, body) {
                    });
                    if (status.interval == 3 && status.status == "active") {
                        var options = {
                            uri: 'http://localhost/api/nodemanager/' + status._id,
                            method: 'PUT',
                            headers: {
                                'Content-Type': 'application/json'
                            },
                            json: {"status": "intermittent failures"}
                        };
                        request(options, function (error, response, body) {
                        });
                    }
                    if (status.interval == 30 && status.status == "intermittent failures") {
                        var options = {
                            uri: 'http://localhost/api/nodemanager/' + status._id,
                            method: 'PUT',
                            headers: {
                                'Content-Type': 'application/json'
                            },
                            json: {"status": "inactive"}
                        };
                        request(options, function (error, response, body) {
                        });
                    }

                }
            }
        });
    });
});

我运行查询以获取传感器的旧时间戳

拉后我再次运行查询以获取新的时间戳

但时间戳始终相同,因为重新检查在插入完成之前发生,因为insert方法是异步的。即使我在插入方法之后调用recheck方法。

1 个答案:

答案 0 :(得分:0)

您可以通过"新日期"插入时间戳。更多信息和示例here.

示例代码:

db.products.update(
   { _id: 1 },
   {
     $set: { item: "apple" },
     $setOnInsert: { dateAdded: new Date() }
   },
    { upsert: true }
)

然后您只需执行查询即可找到过时的传感器。