我正在使用nodeJS,express和mongoDB开发应用程序,我需要从csv文件中获取用户数据并将其上传到我的数据库,这个数据库有一个用mongoose设计的模式。
但是我不知道如何做到这一点,读取csv文件的最佳方法是检查db的重复项,如果用户(csv中的一列)不在这里插入它?
是否有一些模块可以做到这一点?或者我需要从头开始构建它?我对nodeJS很新 我在这里需要一些建议
谢谢
这个应用程序有一个角度前端,所以用户可以上传文件,也许我应该读取前端的csv并将其转换为节点的数组,然后插入它?
答案 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
});
}