不能使用mongoose将多个对象添加到db中

时间:2016-03-26 23:03:43

标签: javascript mongoose

我有一个函数应该在每次匹配时添加新项目,如下所示:

/*Comparison function: Score ascending only.*/
int cmp_sasc(const void *p, const void *q){
    record * const *pp = p;
    record * const *qq = q;
    return (*pp)->score - (*qq)->score;
}

由于某种原因,它只为每个找到的学生插入一次。 我的学生模式如下所示:

    function getTimeEntriesFromWorksnap(error, response, body) {
    //console.log(response.statusCode);
    var counter = 1;
    if (!error && response.statusCode == 200) {
        parser.parseString(body, function (err, results) {
            var json_string = JSON.stringify(results.time_entries);
            var timeEntries = JSON.parse(json_string);

            _.forEach(timeEntries, function (timeEntry) {
                _.forEach(timeEntry, function (item) {
                    Student.findOne({'worksnap.user.user_id': item.user_id[0]})
                        .populate('user')
                        .exec(function (err, student) {
                            if (err) {
                                throw err;
                            }

                            var newTimeEntry = _pushToObject(student.worksnap.timeEntries, item);

                            student.worksnap.timeEntries = {};
                            student.worksnap.timeEntries = newTimeEntry;

                            student.save(function (err) {
                                if (err) {
                                    //return res.status(400).send({
                                    //    message: errorHandler.getErrorMessage(err)
                                    //});
                                } else {
                                    //res.json(item);
                                }
                            });

                        });
                });
            });
        });
    }
}

任何解决方案?

1 个答案:

答案 0 :(得分:0)

我的猜测是它始终推动最后一个... closures ...

function getTimeEntriesFromWorksnap(error, response, body) {
    //console.log(response.statusCode);
    var counter = 1;
    if (!error && response.statusCode == 200) {
        parser.parseString(body, function (err, results) {
            var json_string = JSON.stringify(results.time_entries);
            var timeEntries = JSON.parse(json_string);

            _.forEach(timeEntries, function (timeEntry) {
                _.forEach(timeEntry, function (item) {
                    saveStudent(item);
               });
            });
        });
    }
}

以下是saveStudent功能

function saveStudent(item) {

    Student.findOne({
            'worksnap.user.user_id': item.user_id[0]
        })
        .populate('user')
        .exec(function(err, student) {
            if (err) {
                throw err;
            }

            var newTimeEntry = _pushToObject(student.worksnap.timeEntries, item);

            student.worksnap.timeEntries = {};
            student.worksnap.timeEntries = newTimeEntry;

            student.save(function(err) {
                if (err) {
                    //return res.status(400).send({
                    //    message: errorHandler.getErrorMessage(err)
                    //});
                } else {
                    //res.json(item);
                }
            });

        });
}

将其包裹在封闭内......

function getTimeEntriesFromWorksnap(error, response, body) {
    //console.log(response.statusCode);
    var counter = 1;
    if (!error && response.statusCode == 200) {
        parser.parseString(body, function(err, results) {
            var json_string = JSON.stringify(results.time_entries);
            var timeEntries = JSON.parse(json_string);

            _.forEach(timeEntries, function(timeEntry) {
                _.forEach(timeEntry, function(item) {
                  (function(item){
                    Student.findOne({
                            'worksnap.user.user_id': item.user_id[0]
                        })
                        .populate('user')
                        .exec(function(err, student) {
                            if (err) {
                                throw err;
                            }

                            var newTimeEntry = _pushToObject(student.worksnap.timeEntries, item);

                            student.worksnap.timeEntries = {};
                            student.worksnap.timeEntries = newTimeEntry;

                            student.save(function(err) {
                                if (err) {
                                    //return res.status(400).send({
                                    //    message: errorHandler.getErrorMessage(err)
                                    //});
                                } else {
                                    //res.json(item);
                                }
                            });

                        });
                  }(item))
                });
            });
        });
    }
}

您可以使用async库并查看...

var async = require('async');
async.map(timeEntries, function (timeEntry, next) {
   async.map(timeEntry, function (item, next) {
      //your code.
  });
});