2016-06-15 5 views
0

私は入力する400,000行を持っており、それを解読する必要があります。残念ながら、私はすべてが完了するまで、このスクリプトを終了することはできません。それはもちろん、記憶の中で常に不足しています。私は(「終了」、機能()は有用であろうが、.onデータが完了した後、私はその値を見ることはできません.onで値を設定すると思った。mongo dbの書き込み後にnodejsスクリプトを終了するには

'use strict'; 
var mongoose = require('mongoose'); 
var fs = require('fs'); 
var parse = require('csv-parse'); 
var Schema = mongoose.Schema; 
var done; 

mongoose.connect('mongodb://127.0.0.1:27017/auth'); 

var userSchema = new mongoose.Schema({ 
    username: { 
    type: String, 
    unique: true 
    }, 
    password: String, 
    email: { 
    type: String, 
    unique: true 
    }, 
    isActive: String, 
    roles: { 
    account: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'Account' 
    } 
    }, 
    timeCreated: { 
    type: Date, 
    default: Date.now 
    }, 
    search: [String] 
}); 

var accountSchema = new mongoose.Schema({ 
    user: { 
    id: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    name: { 
     type: String, 
     default: '' 
    } 
    }, 
    isVerified: { 
    type: String, 
    default: '' 
    }, 
    verificationToken: { 
    type: String, 
    default: '' 
    }, 
    name: { 
    first: { 
     type: String, 
     default: '' 
    }, 
    middle: { 
     type: String, 
     default: '' 
    }, 
    last: { 
     type: String, 
     default: '' 
    }, 
    full: { 
     type: String, 
     default: '' 
    } 
    }, 
    company: { 
    type: String, 
    default: '' 
    }, 
    phone: { 
    type: String, 
    default: '' 
    }, 
    zip: { 
    type: String, 
    default: '' 
    }, 
    memberid: { 
    type: String, 
    default: '' 
    }, 
    status: { 
    id: { 
     type: String, 
     ref: 'Status' 
    }, 
    name: { 
     type: String, 
     default: '' 
    }, 
    userCreated: { 
     id: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
     }, 
     name: { 
     type: String, 
     default: '' 
     }, 
     time: { 
     type: Date, 
     default: Date.now 
     } 
    } 
    }, 
    userCreated: { 
    id: { 
     type: mongoose.Schema.Types.ObjectId, 
     ref: 'User' 
    }, 
    name: { 
     type: String, 
     default: '' 
    }, 
    time: { 
     type: Date, 
     default: Date.now 
    } 
    }, 
    search: [String] 
}); 

var User = mongoose.model('User', userSchema); 
var Account = mongoose.model('Account', accountSchema); 

fs.createReadStream('./ipart') 
    .pipe(parse({ 
    delimiter: ',' 
    })) 
    .on("data-invalid", function(data) {}) 
    .on('data', function(csvrow) { 
    var u = { 
     isActive: 'yes', 
     username: csvrow[0], 
     email: csvrow[0], 
     search: [ 
     csvrow[1] + ' ' + csvrow[2], 
     csvrow[0], 
     ] 
    }; 

    User.create(u, function(err, createdUser) { 
     if (err) { 
     console.log(err); 
     return; 
     } 
     var user = createdUser; 
     var displayName = csvrow[1] + ' ' + csvrow[2] || ''; 
     var nameParts = displayName.split(' '); 
     var acct = { 
     isVerified: 'no', 
     'name.first': nameParts[0], 
     'name.last': nameParts[1] || '', 
     'name.full': displayName, 
     user: { 
      id: user._id, 
      name: user.username 
     }, 
     search: [ 
      nameParts[0], 
      nameParts[1] || '' 
     ] 
     }; 

     Account.create(acct, function(err, account) { 
     if (err) { 
      return workflow.emit('exception', err); 
     } 
     var fieldstoset = { 
      roles: { 
      account: account._id 
      } 
     }; 
     User.findByIdAndUpdate(account.user.id, fieldstoset, function(err, user) { 
      if (err) throw err; 
     }); 
     }); 
    }); 
    }) 
    .on('end', function() { 
    console.log('complete'); 
    }); 

答えて

0

あなたは本当に一括挿入を使用する必要があり、私はどこかにこのコードを発見し、あなたのため

  var Potato = mongoose.model('Potato', PotatoSchema); 
     var potatoBag = [/* a humongous amount of potato objects */]; 
     Potato.collection.insert(potatoBag, onInsert); 
     function onInsert(err, docs) { 
      if (err) { 
      // TODO: handle error 
      } else { 
      console.info('%d potatoes were successfully stored.', docs.length); 
      } 
     } 
0

を貼り付ける私はこれらの次のステップにあなたのCSVデータをインポートするあなたの全体のロジックを打破するために、あなたをお勧めします: 1.にCSVをインポートし、簡単なスクリプトファイルを書きますこのような一時的なコレクション:

0123あなたのユーザーを作成する前の

YourImportScript

#!/bin/bash 
mongoimport -d YourDBName -c YourTempCollectionName --drop --type csv --file pathToYourCSVFile.csv --headerline 

2.実行スクリプト:

var exec = require('child_process').exec; 
function importCSV(callback) { 
    exec("./pathToYourImportScript/YourImportScript", function (error, stdout, stderr) { 
     console.log(stdout); 
     if (error !== null) 
      console.log('exec error: ' + error); 
     }); 

     callback() 
    } 

MongoImportはかなり迅速にCSVをインポートします。

  1. 一時コレクションからドキュメントを取得し、それらをユーザーコレクションに挿入します。インポート時にモデルを作成することができるよう、あなたのCSVの列にヘッダを置くために
async.series([ 
        function (callback) { 
         //CSV Import function 
        }, 
        function (callback) { 
     //User Manupulation function 
     }]); 

そして、それは良いです: また、きちんとあなたのコードモードの流れを制御するための非同期モジュールを使用することができますテンポラリコレクションのドキュメントを作成することができ、username: csvrow[0]の代わりにusername:myCSVModel.usernameのような列ヘッダーによってユーザーのプロパティを取得する方が簡単です。

関連する問題