2013-01-07 108 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