【问题标题】:MongoDB using Mongoose save issuesMongoDB 使用 Mongoose 保存问题
【发布时间】:2016-04-16 21:50:21
【问题描述】:

我在使用 mongoose 在我的 mongodb 中保存数据时遇到了一些问题。这是我使用的代码:

////////////////////////////////////////
//// Mongoose test
var url = mongoUrl + dbCollectionName;

var mongoose = require('mongoose');
mongoose.connect(url);
var db = mongoose.connection;

db.on('error', console.error.bind(console, 'connection error:'));
db.once('open', function (callback) {
    console.log(getTimeStamp() + 'Connected to Mongo with Mongoose');
    insertDocuments(db);
});

var ackSchema = new mongoose.Schema({
    hostgroup : String,
    host : String,
    service : String,
    timePeriod : String,
    startTime : Number,
    ackTime : Number,
    deltaTime : Number,
    caseNumb : String,
    state : Number,
    author : String,
    ackId : Number,
    });

// Creation of the model document
var ackModel = mongoose.model(collectionName, ackSchema, collectionName);

//////////////////////////////////////
//// Functions

// MySQL function (query, push to array etc)
var mysqlQuery = function (callback) {
    var query = mysqlConnection.query(sqlQuery), sql = [];
    var anyRow = 0;
    // Log query error
    query.on('error', function (err) {
        if (err) {
            console.error(getTimeStamp() + 'Error in MySQL query: ' + err);
            return;
        }
    });

    // On result, push results in sql array
    query.on('result', function (row) {
        // Non-blocking I/O
        mysqlConnection.pause();
        mysqlConnection.resume();
        sql.push(row);
        callback(row);
    });

    // Information then close connection
    query.on('end', function (row) {
        // If anRow == 1, close the app.
        if (!row) { anyRow = 1; }
        if (row) { anyRow = 0; }

        if (anyRow == 1) {
            console.log(getTimeStamp() + 'Connection to Mongoose closed ');
            console.log(getTimeStamp() + 'Connection to MySQL closed ');
            process.exit(0);
        }
        if (anyRow == 0) {
            console.log(getTimeStamp() + 'Connection to Mongoose closed ');
            console.log(getTimeStamp() + 'Connection to MySQL closed ');
        }
    });
    mysqlConnection.end();
};               

// Insert Documents into mongodb using MySQL info and mongoose ackModel.
var insertDocuments = function(db) {
    // SQL Query to fetch row
    mysqlQuery(function (row) {
        //// IF 8/20
        if (row.timeperiod == timePeriod820) {
            returnValue = timePeriodCalc(row); // Function from timeperiod.js
            deltaValue = parseInt(returnValue.slice(6)); // Get our Delta Value
            caseValue = returnValue.slice(0,4); // Get the Case Number, verification purpose
        //// ELSE 24/7
        } else {
            deltaValue = (row.ack_time - row.start_time);
            caseValue = 'C.0';};
        };

        var ack = new ackModel({
            hostgroup : row.hostgroup,
            host : row.hostname,
            service : row.servicename,
            timePeriod : row.timeperiod,
            startTime : row.start_time,
            ackTime : row.ack_time,
            state : row.state,
            deltaTime : deltaValue,
            caseNumb : caseValue,
            author : row.author,
            ackId : row.ack_id});

        console.log(ack);       
        //console.log(getTimeStamp() + 'SAVE Mongoose : ' + ack.author + ' ' + ack.ackId);

        ack.save(function (err1, ack) {
            if (err1) {
                console.log(getTimeStamp() + 'Mongoose .save error : ' + err1);
            }
            else { 
                console.log(getTimeStamp() + 'SAVE Mongoose : ' + ack.author + ' ' + ack.ackId); 
            }
        });
    }); 
};  

这是日志返回的内容:

[2016-01-12 10:56:04.403] - Connected to Mongo with Mongoose
{ _id: 5694cdb49b274b1100262896,
  ackId: 1184,
  author: 'victor.b',
  caseNumb: 'C.10',
  deltaTime: -1200,
  state: 2,
  ackTime: 1452590840,
  startTime: 1452592040,
  timePeriod: 'RESSOURCES-GPE-N1-8/20',
  service: 'Service-Random-5M',
  host: 'CRI_HOST3',
  hostgroup: 'CRIDF' }
[2016-01-12 10:56:04.506] - Connection to Mongoose closed
[2016-01-12 10:56:04.507] - Connection to MySQL closed

所以你可以看到一切似乎都很好,因为我的 ackModel 的 ack 文档完美地填充了正确的信息。但是保存没有用。在来这里之前我已经测试了很多东西,但我没有想法。

编辑 1:感谢@zangw,我发现我的问题来自这段代码:

// On result, push results in sql array
query.on('result', function (row) {
    // Non-blocking I/O
    mysqlConnection.pause();
    mysqlConnection.resume();
    sql.push(row);
    callback(row);
});

由于我没有完全使用 node.js 回调,也许我在那里的回调做错了。

【问题讨论】:

  • 我只是根据你的代码测试它,得到结果SAVE Mongoose : victor.b 1184,这里是code,我只是删除了mysqlQuerygetTimeStamp(),因为我没有清除它们。 ..
  • 你有没有检查过这个ack是否被保存到了mongoDB中?
  • 是的,当然,ack 应该保存到我的 col_201601 但集合没有创建:Screenshoot
  • @zangw 从您使用的代码开始,我在每一步都添加了尝试和记录的代码,看来我的问题来自 query.on('result' ... ) 块。

标签: node.js mongodb mongoose


【解决方案1】:

所以问题出在这部分:

    query.on('end', function (row) {
    // If anRow == 1, close the app.
    if (!row) { anyRow = 1; }
    if (row) { anyRow = 0; }
    if (anyRow == 1) {
        console.log(getTimeStamp() + 'Connection to MongoDB closed ');
        console.log(getTimeStamp() + 'Connection to MySQL closed ');
        process.exit(0);
    }
    if (anyRow == 0) {
        console.log(getTimeStamp() + 'Connection to MongoDB closed ');
        console.log(getTimeStamp() + 'Connection to MySQL closed ');
    }
});

所以我已经停止使用 usinf 流读取行并将 MySQLQuery 和 inserdocuments 函数更改为一个更简单的函数:

var insertDocuments = function() {
// Get the documents collection
var returnValue = 0,
    caseValue = "";
var test = 0;
var ackAllreadyExist = 0;

//var query = mysqlConnection.query(sqlQuery), sql = [];
var query = mysqlConnection.query(sqlQuery, function(err,row) {
    if(err) console.log('MySQL error : ' + err);
    for (var i=0; i<row.length; i++){
        //// IF 8/20
        if (row[i].timeperiod == timePeriod820) {
            returnValue = timePeriodCalc(row[i]); // Function from timeperiod.js
            deltaValue = parseInt(returnValue.slice(6)); // Get our Delta Value
            caseValue = returnValue.slice(0,4); // Get the Case Number, verification purpose
        //// ELSE 24/7
        } else {
            deltaValue = (row[i].ack_time - row[i].start_time);
            caseValue = 'C.0';
        };

        var ack = new ackModel({
            hostgroup : row[i].hostgroup,
            host : row[i].hostname,
            service : row[i].servicename,
            timePeriod : row[i].timeperiod,
            startTime : row[i].start_time,
            ackTime : row[i].ack_time,
            state : row[i].state,
            deltaTime : deltaValue,
            caseNumb : caseValue,
            author : row[i].author,
            ackId : row[i].ack_id});

        //console.log(row[i]);
        //console.log(ack);     
        //console.log(getTimeStamp() + 'SAVE Mongoose : ' + ack.author + ' ' + ack.ackId);

        ack.save(function (err,ack) {
            if (err) {
                console.log(getTimeStamp() + 'Mongoose .save error : ' + err);
            };
            console.log(getTimeStamp() + 'SAVE Mongoose : ' + ack.author + ' ' + ack.ackId); 
            test++;
            if(test == row.length) {
                mysqlConnection.end();
                console.log(getTimeStamp() + 'Connection to MongoDB closed ');
                console.log(getTimeStamp() + 'Connection to MySQL closed ');
                process.exit(0);
            };
        });
        if (debug == 1) { 
            console.log(getTimeStamp() + 'SAVE Mongoose : ' + ack.author + ' ' + ack.ackId); 
        };
    };
});
};

我不打算在 node.js 中这样工作,但我知道,但在解决这个问题 2 周后(这是为了我的工作,钱!)我不再介意了。

感谢@zangw 向我展示了答案的开头。

【讨论】:

    猜你喜欢
    • 2011-10-09
    • 2016-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-01
    相关资源
    最近更新 更多