如何使用异步任务保存多个JSON数据对象

时间:2018-10-21 23:03:02

标签: javascript node.js json asynchronous mongoose

我从服务器上以数组的形式获取了几个JSON对象,并且需要一种针对我的数据库检查所有JSON对象的方法,以确定是否需要创建一个新对象。但是,由于异步任务的工作方式不同,我用来确定该对象是否已经在数据库中的对象始终等于服务器中数组中的最后一个对象,还是在到达Collection.findOne({...});

之前未定义的对象

代码:

for (var i = 0; i < elseArray.length; i++) {
    var tempArray = elseArray[i][0].split(' ');
    var month = getMonthFromString(tempArray[0]);
    var date = tempArray[1];
    var name = Name[i];
    var loc = "";
    if (elseArray[i][1].indexOf(':') != -1) {
        min = elseArray[i][1].substring(elseArray[i][1].indexOf(':') + 1, elseArray[i][1].indexOf(':') + 3);
    }
    if (elseArray[i][1].includes("p.m.")) {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10) + 12;
    } else {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10);
    }
    if (elseArray[i][2].replace(/\s/g, '') == "Event") {
        loc = "Blue House"
    } else {
        loc = "Red House"
    }
    Collection.findOne({
        Name: name,
        Loc: loc,
        "DateTime.Year": year,
        "DateTime.Month": month,
        "DateTime.Day": day
    }, function(err, CollItem) {
        if (err) {
            res.send("MongoDB Error: " + err);
            return false;
        }
        if (!CollItem) {
            var E = new Collection({
                Name: name,
                Loc: loc,
                Capacity: 0,
                Attendance: 0,
                DateTime: {
                    Year: year,
                    Month: month,
                    Day: day,
                    Hour: hour,
                    Min: min,
                    Sec: 0
                }
            });
            E.save();
        }
    });
}

if (elseArray[i].length == 4) {
    if (elseArray[i][3].replace(/\s/g, '') == "Event") {
        loc = "Blue House"
    } else {
        loc = "Red House"
    }
    Collection.findOne({
        Name: name,
        Loc: loc,
        "DateTime.Year": year,
        "DateTime.Month": month,
        "DateTime.Day": day
    }, function(err, CollItem) {
        if (err) {
            res.send("MongoDB Error: " + err);
            return false;
        }
        if (!CollItem) {
            var E = new Collection({
                Name: name,
                Loc: loc,
                Capacity: 0,
                Attendance: 0,
                DateTime: {
                    Year: year,
                    Month: month,
                    Day: day,
                    Hour: hour,
                    Min: min,
                    Sec: 0
                }
            });
            E.save();
        }
    });
}
}
}

1 个答案:

答案 0 :(得分:0)

我发现对我有用的解决方案是使用for循环遍历数据数组,然后在for循环内部调用一个方法,该方法检查数据是否在服务器上。

代码:

for (var i = 0; i < elseArray.length; i++) {
    var tempArray = elseArray[i][0].split(' ');
    var month = getMonthFromString(tempArray[0]);
    var date = tempArray[1];
    var name = Name[i];
    var loc = "";
    if (elseArray[i][1].indexOf(':') != -1) {
        min = elseArray[i][1].substring(elseArray[i][1].indexOf(':') + 1, elseArray[i][1].indexOf(':') + 3);
    }
    if (elseArray[i][1].includes("p.m.")) {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10) + 12;
    } else {
        hour = parseInt(elseArray[i][1].substring(0, elseArray[i][1].indexOf('–')), 10);
    }
    if (elseArray[i][2].replace(/\s/g, '') == "Event") {
        loc = "Blue House"
    } else {
        loc = "Red House"
    }
    getQuery(name, loc, year, month, date, hour, min);

    if (elseArray[i].length == 4) {
        if (elseArray[i][3].replace(/\s/g, '') == "Event") {
            loc = "Blue House"
        } else {
            loc = "Red House"
        }
        getQuery(name, loc, year, month, date, hour, min);
    }
}

在for循环中,从服务器读取数据数组,读取数据,将所有内容存储在变量中,然后调用getQuery(),它检查数据库中的当前数据并在以下情况下创建新的JSON对象:在数据库中找不到当前数据。

getQuery()方法:

function getQuery()(name, loc, year, month, day, hour, min) {
Collection.findOne({
    Name: name,
    Loc: loc,
    "DateTime.Year": year,
    "DateTime.Month": month,
    "DateTime.Day": day
}, function(err, CollItem) {
    if (err) {
        res.send("MongoDB Error: " + err);
        return false;
    }
    if (!CollItem) {
        var E = new Collection({
            Name: name,
            Loc: loc,
            Capacity: 0,
            Attendance: 0,
            DateTime: {
                Year: year,
                Month: month,
                Day: day,
                Hour: hour,
                Min: min,
                Sec: 0
            }
        });
        E.save();
    }
});
}

在方法getQuery()中,如果找到与传递的name, loc, year, etc...相匹配的对象,则不会发生任何事情,否则将数据保存并存储在数据库中。

简而言之,我将Collection.findOne({...});变成了自己的名为getQuery()的方法,以解决异步任务和Collection.findOne({...});之间的速度差异。