2016-01-12 7 views
3

У меня есть проблемы с сохранением данных в моем mongodb с использованием мангуста. Вот код, который я использую:MongoDB using Mongoose save issues

//////////////////////////////////////// 
//// 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 заполнена полностью с правильная информация. Но сэкономить не получилось. Я тестировал много вещей, прежде чем приходить сюда, но у меня нет идей.

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

Поскольку я не tottally используется с Node.js обратных вызовов, может быть, я» что-то не так с тем, что там.

+0

Я просто проверяю его на основе ваших кодов и получаю результат 'SAVE Mongoose: victor.b 1184', вот [код] (https://gist.github.com/richzw/827054124f8b6b0282a4), я просто удаляю 'mysqlQuery' и' getTimeStamp() ', потому что я не понимаю их ... – zangw

+0

Вы проверяете, сохранен ли этот' ack' в mongoDB или нет? – zangw

+0

Да, конечно, ack должен быть сохранен в моем col_201601, но коллекция не создана: [Screenshoot] (http://puu.sh/msSFM/4b23d4f495.png) –

ответ

0

Так что проблема была из этой части:

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 за то, что показал мне начало ответа.