不能使用mongoose将多个对象添加到数据库中

cant add more than one object into db using mongoose

本文关键字:添加 对象 数据库 mongoose 不能      更新时间:2023-09-26

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

    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);
                                }
                            });
                        });
                });
            });
        });
    }
}

出于某种原因,它只为找到的每个学生插入一次。我的学生模式是这样的:

    var StudentSchema = new Schema({
    firstName: {
        type: String,
        trim: true,
        default: ''
        //validate: [validateLocalStrategyProperty, 'Please fill in your first name']
    },
    lastName: {
        type: String,
        trim: true,
        default: ''
        //validate: [validateLocalStrategyProperty, 'Please fill in your last name']
    },
    worksnap: {
        user: {
            type: Object
        },
        timeEntries: {
            type: Object
        },
     }
   });

有什么解决方案吗?

我的猜测是它总是推最后一个。。。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.
  });
});