【问题标题】:Import text files (CSV format) into mongodb using mongoose schema使用 mongoose 模式将文本文件(CSV 格式)导入 mongodb
【发布时间】:2015-05-27 10:20:07
【问题描述】:

我是 moogoose/mongodb 的新手,我正在尝试导入数据。我有一个 REGIONS.model.js 文件...

var mongoose = require('mongoose');
var Schema = mongoose.Schema;

var REGIONS = new Schema({
    CODE: String,
    DESCRIPTION_FRANCAISE: String,
    DESCRIPTION_ANGLAISE: String
});

module.exports = mongoose.model('REGIONS', REGIONS);

还有一个 REGIONS.TXT 文件...

"01","Bas-Saint-Laurent","Bas-Saint-Laurent"
"02","Saguenay/Lac-Saint-Jean","Saguenay/Lac-Saint-Jean"
"03","Capitale-Nationale","Capitale-Nationale"
"04","Mauricie","Mauricie"
"05","Estrie","Estrie"
"06","Montréal","Montréal"
"07","Outaouais","Outaouais"
"08","Abitibi-Témiscamingue","Abitibi-Témiscamingue"
"09","Côte-Nord","Côte-Nord"
"10","Nord-du-Québec","Nord-du-Québec"
"11","Gaspésie/Iles-de-la-Madeleine","Gaspésie/Iles-de-la-Madeleine"
"12","Chaudière-Appalaches","Chaudière-Appalaches"
"13","Laval","Laval"
"14","Lanaudière","Lanaudière"
"15","Laurentides","Laurentides"
"16","Montérégie","Montérégie"
"17","Centre-du-Québec","Centre-du-Québec"
"50","Autres provinces","Other provinces"
"70","Etats-Unis","USA"
"80","Autres pays","Other countries"

我想将 REGIONS.TXT 的数据导入到一个尊重 REGIONS Schema 的 mongodb 数据库文档中。

事实上,我需要每天导入多个 TXT 文件,并且需要与相应的 Schema 匹配。 (*.TXT 文件中没有标题

*已更新解释为什么它不是重复的,

我不希望硬编码 Schema 的键列表并在硬编码函数中使用它们,因为我有很多 Schema 和相应的数据文件 (*.TXT)。

我想我需要“扫描”模式(与 TXT 文件同名)并动态“构建”函数。或者也许有一些内置在猫鼬中的东西?

非常感谢您的时间和帮助。

【问题讨论】:

    标签: node.js mongodb csv mongoose


    【解决方案1】:

    不幸的是,由于模式(对象)中键的顺序不能保证与文件的顺序相同,因此您需要在某个数组中保留字段列表。我假设您知道每个文件的格式(字段及其顺序)以及每个文件应导入的相应模型。

    使用以下代码创建一个新模块。我将其命名为 csv.js:

    var mongoose = require('mongoose')
      , csv = require('fast-csv');
    
    module.exports.importFile = function(filePath, fileHeaders, modelName) {
        csv
            .fromPath(filePath, {headers: fileHeaders})
            .on('data', function(data) {
    
                var Obj = mongoose.model(modelName);
    
                var obj = new Obj();
    
                Object.keys(data).forEach(function(key) {
                    var val = data[key];
    
                    if (val !== '')
                        obj.set(key, val);
                });
    
                obj.save(function (err) {
                    if (err)
                        console.log(err);
                });
            })
            .on('end', function() {
                console.log("done");
            });
    }
    

    您需要使用导入文件的属性(名称、标题和模型名称)在某处创建一个对象。

    var csv = require('./csv');
    
    var csvHeaders = {
        REGIONS: {
            headers: ['CODE', 'DESCRIPTION_FRANCAISE', 'DESCRIPTION_ANGLAISE']
        },
        STATES: {
            headers: ['something']
        }
    }
    
    //adjust this path to the correct location
    csv.importFile(__dirname + '/REGION.CSV', csvHeaders.REGIONS.headers, 'REGIONS');
    

    【讨论】:

      猜你喜欢
      • 2018-11-06
      • 1970-01-01
      • 1970-01-01
      • 2016-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多