2013-01-07 146 views
4

首先,我是Node.js和MongoDB的新手。我目前正在研究一个Web应用程序,用于工作。它涉及将数据分配给数据库中的代表,然后访问应用程序中的数据。从Node.js的CSV文件导入多个条目到MongoDB App

我必须使用的数据在Excel文件中。我可以获取该Excel文件并从中创建一个CSV文件以导入到MongoDB中。我的问题是,我有多个机会绑定到个人代表。我想弄清楚如何为我的应用程序设置数据库,以便我可以导入此CSV文件的位置,并且它将保存代表数据库中特定代表的代表的所有数据。

这里的数据的一个示例:
代表名称,奥普ID,奥普名称,在此之前金额,金额
代表1,1234561,奥普1,10000,8000
代表1,1234562,奥普2,15000 ,9000
代表2,1234563,奥普3,20000,10000
代表1,1234564,奥普4,25000,11000
代表2,1234565,奥普5,30000,12000

基本上I”我希望能够导入csv文件,以这种格式,在节点中有一个模型。 js将支持此导入,然后能够在应用程序内为每个代表提取数据。例如,所有代表的概览将显示如下: 代表1将有3个Opps显示和代表2将有2个Opps显示

这甚至可能吗?我是否以这种错误的方式去做?有没有更好的方法来做到这一点? 任何提示,技巧,建议或例子,以帮助指导我会很好。

回答

8

既然您似乎熟悉ORM模式,我会推荐使用"mongoose" module。虽然我猜想你会通过NodeJS和Mongo有一个很大的学习曲线来制作一个可靠的应用程序。

这里的工作的例子,让你虽然起步:在“mytest.csv”

#! /usr/bin/node 

var mongoose = require('mongoose'); 
mongoose.connect('localhost', 'test'); 

var fs = require('fs'); 
var lineList = fs.readFileSync('mytest.csv').toString().split('\n'); 
lineList.shift(); // Shift the headings off the list of records. 

var schemaKeyList = ['RepName', 'OppID', 'OppName', 'PriorAmount', 'Amount']; 

var RepOppSchema = new mongoose.Schema({ 
    RepName: String, 
    OppID: String, 
    OppName: String, 
    PriorAmount: Number, 
    Amount: Number 
}); 
var RepOppDoc = mongoose.model('RepOpp', RepOppSchema); 

function queryAllEntries() { 
    RepOppDoc.aggregate(
     {$group: {_id: '$RepName', oppArray: {$push: { 
      OppID: '$OppID', 
      OppName: '$OppName', 
      PriorAmount: '$PriorAmount', 
      Amount: '$Amount' 
      }} 
     }}, function(err, qDocList) { 
     console.log(util.inspect(qDocList, false, 10)); 
     process.exit(0); 
    }); 
} 

// Recursively go through list adding documents. 
// (This will overload the stack when lots of entries 
// are inserted. In practice I make heavy use the NodeJS 
// "async" module to avoid such situations.) 
function createDocRecurse (err) { 
    if (err) { 
     console.log(err); 
     process.exit(1); 
    } 
    if (lineList.length) { 
     var line = lineList.shift(); 
     var doc = new RepOppDoc(); 
     line.split(',').forEach(function (entry, i) { 
      doc[schemaKeyList[i]] = entry; 
     }); 
     doc.save(createDocRecurse); 
    } else { 
     // After the last entry query to show the result. 
     queryAllEntries(); 
    } 
} 

createDocRecurse(null); 

您的数据:

Rep Name,Opp ID,Opp Name,Prior Amount,Amount 
Rep 1,1234561,Opp 1,10000,8000 
Rep 1,1234562,Opp 2,15000,9000 
Rep 2,1234563,Opp 3,20000,10000 
Rep 1,1234564,Opp 4,25000,11000 
Rep 2,1234565,Opp 5,30000,12000 
+0

是否有可能建立一个代表模型,并有进口过程分开?最初,我有一个rep的模型设置,然后我正在浏览控制台,使用mongoimport将csv数据导入数据库,并使用头文件作为变量名称来代表模型。我觉得你所提供的绝对是我想要走的方向。 – petey

+0

回复:是否可以为代表设置模型并使导入过程分离? - 当然。多个进程可以连接到同一个数据库。虽然对于猫鼬模型模式定义需要在所有的过程中。 – mjhm

+0

我能够测试出来,它效果很好!我设法设置了模型,并从一个单独的页面导入过程,允许用户单击按钮导入数据。我现在唯一遇到的问题是Nodemon(我正在使用Nodemon来帮助开发过程)不希望在数据导入后重新启动。我确定这可能是我在代码中缺少的东西。有什么想法可能是什么? – petey