如何使用nodejs将csv数据插入mongodb

时间:2014-07-20 19:37:22

标签: node.js angularjs mongodb csv

我正在使用nodeJS,express和mongoDB开发应用程序,我需要从csv文件中获取用户数据并将其上传到我的数据库,这个数据库有一个用mongoose设计的模式。

但是我不知道如何做到这一点,读取csv文件的最佳方法是检查db的重复项,如果用户(csv中的一列)不在这里插入它?

是否有一些模块可以做到这一点?或者我需要从头开始构建它?我对nodeJS很新 我在这里需要一些建议

谢谢

这个应用程序有一个角度前端,所以用户可以上传文件,也许我应该读取前端的csv并将其转换为节点的数组,然后插入它?

1 个答案:

答案 0 :(得分:5)

使用几个node.js csv库中的一个,例如this one,然后你可以在用户名上运行upsert

upsert是一个更新查询,其upsert标志设置为true:{upsert: true}。仅当搜索结果为零时,才会插入新记录。所以你的查询可能看起来像这样:

 db.collection.update({username: userName}, newDocumentObj, {upsert: true})

userName是您正在使用的当前用户名,newDocumentObj是可能需要插入的json文档。

但是,如果查询确实返回结果,则会对这些记录执行更新。

编辑: 我已经决定一个upsert不适合这个,但我将留下描述。

你可能需要在这里做两个查询,一个查找和一个条件插入。对于此查找查询,我将使用toArray()函数(而不是流),因为您期望0或1结果。检查您是否在用户名上得到了结果,如果没有插入数据。

了解节点的mongodb库here

编辑回复您的评论: 看起来您正在从本地csv文件中读取数据,因此您应该能够构建类似以下程序:

function connect(callback) {
    connStr = 'mongodb://' + host + ':' + port + '/' + schema;  //command line args, may or may not be needed, hard code if not I guess
    MongoClient.connect(connStr, function(err, db) {
        if(err) {
            callback(err, null);
        } else {
            colObj = db.collection(collection); //command line arg, hard code if not needed
            callback(null, colObj);
        }
    });
}

connect(function(err, colObj) {
    if(err) {
        console.log('Error:', err.stack);
        process.exit(0);
    } else {
        console.log('Connected');
        doWork(colObj, function(err) {
            if(err) {
                console.log(err.stack);
                process.exit(0);
            }
        });
    }
});


function doWork(colObj, callback) {
    csv().from('/path/to/file.csv').on('data', function(data) {
        //mongo query(colObj.find) for data.username or however the data is structured
        //inside callback for colObj.find, check for results, if no results insert data with colObj.insert, callback for doWork inside callback for insert or else of find query check
    });
}