MongoDB Fetch检查数据是否存在

时间:2018-03-06 22:40:08

标签: node.js mongodb

我正在努力寻找编写此代码的最佳方法。我从远程资源获取位置,需要检查数据中是否存在任何新位置,如果有,我应该将它们添加到我的数据库中,如果它们不是新的,我只想更新它们。

const http = require('http');
const timeout = 5000; //5 seconds
const MongoClient = require('mongodb').MongoClient;
// Database Name
const dbName = 'weatherApp';
const url = 'mongodb://localhost:27017';

// Connect using MongoClient
MongoClient.connect(url, function(err, client) {
    if(err){
        console.log(err);
        return;
    }

    const locationsCollection = client.db(dbName).collection('locations');

    (function fetchTemperatureLoop(){
        console.log('Started http request..');
        http.get('remote url..', function(resp){
            var data = '';
            resp.on('data', (chunk) => {
                data += chunk;
            });

            resp.on('end', () => {
                if(data.isJson()){
                    var locations = JSON.parse(data).toArray();
                    (function locationsLoop(){
                        var location = locations.pop();
                        locationsCollection.findOne({location: location.location}, function(err, result){
                            if(err){
                                console.log(err);
                                return;
                            }

                            if(result){
                                //Exists
                                var measurements = result.measurements;
                                measurements.push({timestamp: +new Date, temperature: location.temperature})
                                locationsCollection.update({location: location.location}, {$set: {measurements: measurements}}, function(err){
                                    if(err){
                                        console.log(err);
                                        return;
                                    }

                                    console.log('Added new temperature for location: ' + location.location);
                                    continueLocationsLoop();
                                });
                            }else{
                                //Doesnt exist
                                location.measurements = [];
                                location.measurements.push({timestamp: +new Date, temperature: location.temperature});
                                locationsCollection.insert(location, function(err){
                                    if(err){
                                        console.log(err);
                                        return;
                                    }

                                    console.log('Created new location: ' + location.location);
                                    continueLocationsLoop();
                                });
                            }

                        });

                        function continueLocationsLoop(){
                            if(locations.length){
                                locationsLoop()
                            }else{
                                setTimeout(fetchTemperatureLoop, timeout);
                            }
                        }       
                    })();
                }
            });
        }).on("error", (err) => {
            console.log("Error: " + err.message);
            console.log("Continue anyways..");
            setTimeout(fetchTemperatureLoop, timeout);
        });
    })();
});

String.prototype.isJson = function(){
    try{
        JSON.parse(this);
    }catch(e){
        return false;
    }
    return true;
}

Object.prototype.toArray = function(){
    var arr = [];
    for(var key in this){
        if(this.hasOwnProperty(key)){
            arr.push(this[key]);
        }   
    }
    return arr;
}

我真的想避免使用这么多关闭,但我也不想重复自己。任何以最佳方式重写此代码的帮助都非常适合。 我的主要问题是通过位置进行文盲并对数据库进行调用。

0 个答案:

没有答案