每5分钟使用NodeJS将1000个数据中的10个数据添加/插入到MongoDB中
我目前正在尝试每5分钟插入10个新数据 ,而我目前在我的csv文件中有1000个数据 。
我怎么能这样做? 帮助将不胜感激
以下是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个数据,我被要求这样做。
这是1000data.csv
的1000个数据中的部分数据
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
只要不断地向数组添加数据,并有一个单独的函数来执行每隔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)
这里是间隔函数的输出,表示数组每10秒后处理一次
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
Sikorski的代码是相当不错的,可以工作,但看起来像是刚接触node的代码,所以我将把代码分解成不同的组件,这不仅容易理解,而且也是一个很好的开发实践。
用于连接
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; }) }
现在让我们在一个函数中使用这些函数,让我们说init将运行
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未定义,可能是因为你还没有创build它。
所以你可以做到这一点,
〜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
看看下面的代码是否可以帮助你。
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