2016-12-28 29 views
2

目前我正在試圖插入每5分鐘,走出1000數據,我現在對我的csv文件的10個新的數據1000的數據。追加/插入10每5分鐘到MongoDB中使用的NodeJS

我該怎麼做?幫助將不勝感激

以下是我對appendMongo.js

var fs= require('fs'); 
 
var csv = require('fast-csv'); 
 

 
var mongodb = require('mongodb'); 
 
var url = 'mongodb://localhost:27017/insertDB'; 
 
var MongoClient = mongodb.MongoClient; 
 

 

 
var data; 
 

 
MongoClient.connect(url, function (err, db) { 
 
    if (err) { 
 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
 
    } else { 
 
     console.log('Connection established to', url); 
 
     var collection = db.collection('airports'); 
 
     readData=fs.createReadStream('1000data.csv').pipe(csv()) 
 
        .on('data',function(data){ 
 
         collection.insert({'data': data}); 
 
        }) 
 
        .on('end',function(data){ 
 
         console.log('Read finished'); 
 
        }) 
 

 
    } 
 
    }); //End of Mongo connect

一切CSV文件的代碼是相似的,正如我剛纔複製並粘貼文件,因爲我需要做的1000數據我被要求這樣做。

這是數據出1000個數據的一部分1000data.csv

Machine Unit,Air Temperature °C,Water Temperature °C,Heat Temperature °C,Room Temperature °C,Date,Time 
 
1,61,54,87,20,12/3/2016,8:39AM 
 
2,41,57,92,21,29/9/2016,3:51PM 
 
3,39,53,89,22,22/12/2016,5:30PM 
 
4,56,27,87,23,9/7/2016,6:54AM 
 
5,71,85,76,24,21/10/2016,7:29PM 
 
6,82,64,85,25,22/3/2016,9:38PM 
 
7,91,73,94,26,21/10/2016,1:30PM 
 
8,35,79,89,27,30/4/2016,2:17PM 
 
9,29,59,83,28,18/7/2016,7:49AM 
 
10,19,61,80,29,27/9/2016,8:21PM

+0

您是否嘗試過使用 'setTimeout的'?一旦插入完成,您可以保持一個計數並每5分鐘增加10個計數。 – Shrabanee

+0

我該怎麼做?我目前是nodejs的新手。你能否通過提供代碼來教我如何? @Shrabanee – Marcus

+0

你能告訴我們你的'數據'是什麼樣子嗎? – Shrabanee

回答

0

看看下面的代碼可以幫助你。

var fs= require('fs'); 
 
var csv = require('fast-csv'); 
 

 
var mongodb = require('mongodb'); 
 
var url = 'mongodb://localhost:27017/insertDB'; 
 
var MongoClient = mongodb.MongoClient; 
 
var data; 
 

 
MongoClient.connect(url, function (err, db) { 
 
    if (err) { 
 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
 
    } else { 
 
     console.log('Connection established to', url); 
 
     var collection = db.collection('airports'); 
 
     readData=fs.createReadStream('1000data.csv').pipe(csv()) 
 
        .on('data',function(data) 
 
        { 
 
         var count = 0; // Count initialised to 0 
 
         var timeout = setInterval(function() // Insert 10 record after 5 minutes 
 
         { 
 
         if(count >= 999) // If count is 1000 stop inserting. 
 
         { 
 
          clearInterval(timeout); 
 
         } 
 
         else 
 
         { 
 
          for(var i = count; i < count+10; i++) 
 
          { 
 
          collection.insert({'data': data[i]}, 
 
          function(err) 
 
          { 
 
           console.log(err); 
 
          }); //Insert one record 
 
          } 
 
          count += 10; //Increase the count 
 
         
 
         } 
 
         },300000); 
 
        }) 
 
        .on('end',function(data){ 
 
         console.log('Read finished'); 
 
        }) 
 

 
    } 
 
    }); //End of Mongo connect

或者你可以嘗試下面的代碼

var fs= require('fs'); 
 
var csv = require('fast-csv'); 
 

 
var mongodb = require('mongodb'); 
 
var url = 'mongodb://localhost:27017/insertDB'; 
 
var MongoClient = mongodb.MongoClient; 
 
var data; 
 

 
MongoClient.connect(url, function (err, db) { 
 
    if (err) { 
 
     console.log('Unable to connect to the mongoDB server. Error:', err); 
 
    } else { 
 
     console.log('Connection established to', url); 
 
     var collection = db.collection('airports'); 
 
     readData=fs.createReadStream('1000data.csv').pipe(csv()) 
 
        .on('data',function(data) 
 
        { 
 
         var count = 0; // Count initialised to 0 
 
         var timeout = setInterval(function() // Insert 10 record after 5 minutes 
 
         { 
 
         if(count >= 999) // If count is 1000 stop inserting. 
 
         { 
 
          clearInterval(timeout); 
 
         } 
 
         else 
 
         { 
 
          var temp = []; 
 
          for(var i = count; i < count+10; i++) 
 
          { 
 
          temp.push({'data':data[i]}); 
 
          } 
 
          count += 10; //Increase the count 
 
          collection.insert(temp, function(err){ 
 
           console.log(err); 
 
          }); //Insert 10 records at one time. 
 
         } 
 
         },300000); 
 
        }) 
 
        .on('end',function(data){ 
 
         console.log('Read finished'); 
 
        }) 
 

 
    } 
 
    }); //End of Mongo connect

輸出你會得到你的數據庫將在以下格式:

{data:1,61,54,87,20,12/3/2016,8:39AM}, 
{data:2,41,57,92,21,29/9/2016,3:51PM}, 
{data:3,39,53,89,22,22/12/2016,5:30PM}, 
{data:4,56,27,87,23,9/7/2016,6:54AM}, 
{data:5,71,85,76,24,21/10/2016,7:29PM}, 
{data:6,82,64,85,25,22/3/2016,9:38PM}, 
{data:7,91 ,73,94,26,21/10/2016,1:30PM}, 
{data:8,35,79,89,27,30/4/2016,2:17PM}, 
{data:9,29,59,83,28,18/7/2016,7:49AM}, 
{data:10,19,61,80,29,27/9/2016,8:21PM} 
+0

此代碼對我來說不起作用:( – Marcus

+0

)嘗試編輯的代碼,讓我知道它是否會拋出任何錯誤,嘗試添加控制檯,在使用之前請先了解代碼。 rning。 – Shrabanee

+0

它不會引發任何錯誤,但數據尚未添加到集合中。收藏的數量沒有增加。此外,我希望每5分鐘添加10個數據,而不是全部1000個數據(我已成功完成) – Marcus

1

只需向數組中添加數據並每隔5分鐘執行一次就可以執行一個單獨的函數。這個函數可以處理mongodb連接工作。

準系統下面

'use strict'; 
var fs= require('fs'); 
var csv = require('fast-csv'); 
var dataArray = []; 
var finishedReading = false; 
//set interval limit as you like 
var interval = 1000 * 10; //10secs 
fs.createReadStream('data.csv').pipe(csv()) 
        .on('data',function(data){ 
         console.log(data); 
         dataArray.push(data) 
        }) 
        .on('end',function(data){ 
         console.log('Read finished'); 
         finishedReading = true; 
        }) 


var intervalFn = setInterval(function(){ 
    //you can have check for 10 since you want that many items 
    if(dataArray.length >= 2){ 
     var twoItems = dataArray.splice(0,2); 
     console.log(new Date() + twoItems); 
     //execute mongodb code from here 
    }else if(finishedReading){ 
     //clean up if items left in array are less than 10 and also clear this interval function 
     console.log(new Date() + dataArray.length); 
     clearInterval(intervalFn); 
    } 
},interval) 

這裏是區間函數的輸出顯示,數組後處理每10secs

Wed Dec 28 2016 14:46:09 GMT+0530 (India Standard Time)Machine Unit,Air Temperature �C,Water Temperature �C,Heat Temperature �C,Room Temperature �C,Date,Time,1,61,54,87,20,12/3/2016,8:39AM 
Wed Dec 28 2016 14:46:19 GMT+0530 (India Standard Time)2,41,57,92,21,29/9/2016,3:51PM,3,39,53,89,22,22/12/2016,5:30PM 
Wed Dec 28 2016 14:46:29 GMT+0530 (India Standard Time)4,56,27,87,23,9/7/2016,6:54AM,5,71,85,76,24,21/10/2016,7:29PM 
Wed Dec 28 2016 14:46:39 GMT+0530 (India Standard Time)6,82,64,85,25,22/3/2016,9:38PM,7,91,73,94,26,21/10/2016,1:30PM 
Wed Dec 28 2016 14:46:49 GMT+0530 (India Standard Time)8,35,79,89,27,30/4/2016,2:17PM,9,29,59,83,28,18/7/2016,7:49AM 
+0

嗨@Sikorski我想知道的間隔功能的輸出,發生在我的機器單位1,3,5,7。它們不會被添加,或者只是顯示'偶數' – Marcus

+0

此代碼適用於輸出部分,但不會將數據添加到集合中。它只會打印,但添加收集/ mongodb – Marcus

+0

此代碼適用於輸出部分,但它不會將數據添加到集合中。它只會打印,但不會添加到集合/ mongodb @Sikorski – Marcus

1

西科爾斯基的代碼是相當不錯的,並會工作,但看起來你是新的節點,所以我會將代碼分解爲組件,這不僅更容易理解,而且也是開發中的一個良好實踐。

用於連接

function connectToMongo() { 
    mongoose.connect('mongo_url'); 
} 

用於斷開

function disconnectToMongo() { 
    mongoose.connection.close() 
} 

爲了節省數據

//Db is name of your mongo collection 
Db.create(data, function(err, data) { 
    if (err) { 
    console.log(err); return 
    } 
}); 

對於閱讀整個CSV

function readDoc() { 
    var doc_content = []; 
    fs.createReadStream('data.csv').pipe(csv()) 
       .on('data',function(data){ 
        doc_content.push(data) 
       }) 
       .on('end',function(data){ 
        console.log('Read finished'); 
        return doc_content; 
       }) 
} 

現在,讓我們在一個函數中使用這些功能,可以說which'll運行

function init() { 
    var numOfDocsToSave = 10; //just chnage here for num of docs you want to save in interval 
    var interval = 1000 * 10; //10 secs, thanks Sikorski for this 
    var data = readDoc(); 
    var chunk = []; 
    var intervalId = setInterval(function() { 
    connectToMongo(); 
    if(data.length >= numOfDocsToSave) { 
     chunk = data.splice(0, numOfDocsToSave); 
     saveInMongo(chunk); 
    } else { 
     saveInMongo(data); 
     clearInterval(intervalId); 
    } 
    disconnectoToMongo(); //we should not open connection for 5 minutes when we're not doing any operation 
    }, interval); 
    console.log("Interval ended"); 
} 

希望它可以幫助初始化。

更新

至於你說的db是未來不確定的,可能是因爲你還沒有創建它。

所以,你可以做到這一點,

〜model.js

var mongoose = require('mongoose'); 
mongoose.connect('mongodb://localhost/testDb'); 
module.exports = mongoose.model('Db', { 
    name: String //change argument with your schema 
}); 

現在在你的主文件導入此

var Db = require('./model'); //assuming your model.js and main file are in same directory 
+0

我得到一個錯誤,說Db沒有定義。在'保存數據'下,我已經更改爲我的收藏,這是meibandb。錯誤顯示'ReferrenceError:meibandb未定義' – Marcus

+0

@Marcus請參閱更新並讓我知道你是否仍然有一些錯誤 –