2013-01-07 2 views
4

우선 Node.js와 MongoDB를 처음 사용합니다. 나는 현재 일하고있는 웹 앱을위한 아이디어를 가지고있다. 데이터베이스의 담당자에게 데이터를 할당 한 다음 앱에서 해당 데이터에 액세스하는 작업이 포함됩니다.Node.js 용 CSV 파일에서 MongoDB로 여러 항목 가져 오기 App

내가 사용해야하는 데이터는 Excel 파일에 있습니다. Excel 파일을 가져 와서 MongoDB로 가져올 CSV 파일을 만들 수 있습니다. 제 문제는 개별 대리인에게 여러 기회가 매겨 졌기 때문입니다. 이 CSV 파일을 가져올 수있는 방식으로 내 응용 프로그램 용 데이터베이스를 설치하는 방법을 알아 내려고 데이터베이스의 해당 담당자에게 모든 데이터를 저장합니다.
담당자 이름, OPP ID, OPP 이름, 이전 금액, 금액
의원 1,1234561, OPP 1,10000,8000
의원 1,1234562, OPP 2,15000 : 여기

는 데이터의 예 9000
의원 2,1234563, OPP 기본적으로 나는 '3,20000,10000
의원 1,1234564, OPP 4,25000,11000
의원 2,1234565, OPP 5,30000,12000

이 형식으로 csv 파일을 가져올 수있게하려면 노드 내에 모델이 있어야합니다. js는이 가져 오기를 지원하고 앱 내의 각 담당자에 대한 데이터를 가져올 수 있습니다. 예를 들어, 모든 담당자의 개요는 다음과 같습니다. 담당자 1은 3 개의 Opps를 표시하고 담당자 2는 2 개의 Opps를 표시합니다.

이 경우에도 가능합니까? 내가 잘못된 방향으로가는거야? 이 작업을 수행하는 더 좋은 방법이 있습니까? 나를 인도하는 데 도움이되는 팁, 트릭, 제안 또는 예가 좋습니다.

답변

8

ORM 패턴에 익숙한 것 같아서 "mongoose" module을 사용하는 것이 좋습니다. 노드 슨 (NodeJS)과 몽고 (Mongo)가 튼튼한 앱을 만드는 데 상당한 학습 곡선을 갖게 될 것이라고 생각합니다.

#! /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); 

데이터를 "mytest.csv"에 : 여기

당신이 생각 시작할 수 있도록 작업 예제

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

이 설정에 담당자의 모델이 가능하고 가져 오기를 별도의 과정? 원래 저는 담당자를위한 모델 설정을했고 mongoimport를 사용하여 csv 데이터를 데이터베이스로 가져오고 헤더를 변수 이름으로 사용하여 rep 모델을 사용하여 콘솔을 거치려고했습니다. 당신이 제공 한 것이 내가 가려고하는 방향이라고 확신합니다. – petey

+0

Re : 모델 담당자를 설정하고 가져 오기 프로세스를 별도로 할 수 있습니까? -- 당연하지. 여러 프로세스가 동일한 데이터베이스에 연결할 수 있습니다. 몽구스의 경우 모델 스키마 정의가 모든 프로세스에 있어야합니다. – mjhm

+0

나는 이것을 시험 할 수 있었고 그것은 훌륭하게 작동한다! 모델을 설정하고 사용자가 버튼을 클릭하여 데이터를 가져올 수있는 별도의 페이지에서 가져 오기 프로세스가 작동하도록했습니다. 내가 가지고있는 유일한 문제는 데이터를 가져온 후에 Nodemon (개발 과정을 돕기 위해 Nodemon을 사용하고 있음)을 다시 시작하지 않으려한다는 것입니다. 아마 내가 코드에서 빠진 것이 겠지요. 그게 뭔지 알 겠어? – petey

관련 문제