我使用mongodb驱动程序和快速csv导入mongodb中的csv文件。问题是,如果该记录不在集合中,则需要在集合中插入该记录并以其他方式更新它。记录存在或否由其id确定。除此id之外,我还需要一个自动递增的_id字段.csv如图所示。
1001,a,201
2001,b,202
2001,c,203
3001,d,204
3001,e,205
fast csv读取并作为数据传递给回调。
data=[1001,a,201]
因此,当读取第一条记录时,它应该作为
进入数据库{ "_id":1,rid:"1001", "a":"101"}
第二条记录:
{ "_id":2, rid:"2001", "b":"102"}
现在当第三条记录将作为记录读取时使用rid:" 2001"它已经存在,它应该只通过在其中添加新的key:value来更新记录,即在更新之后它应该是:
{ "_id:2",rid:"2001","a":"101","c":"203"}.
我在更新方法的更新参数中使用$ setOnInsert:{_ id:index}。如果记录已经存在,$ setOnInsert将没有任何效果。现在结合设置upsert:true应该正常工作。但我无法弄清楚如何增加index.I最初尝试使用count方法,并在count的回调中更新记录,但因为没有保证何时执行回调,插入记录后,下一次该记录的计数仍显示为0.可以使用mongoose解决此问题。在mongoose中我们需要一个schema.But我希望每条记录都有不知名的字段数,如:
{_id:1,rid:"1001","a":"101","c":203","d":"208", .. , .. ,..}
查询: 字段= {} 字段[数据[1]] =数据[2];
db.collection("collectionname").update(query,{$setOnInsert:{_id:++index},$set:fields},{upsert:true,w:0} );
还需要自动递增_id。那么如何证明正确的索引(为新记录递增)?即使使用不同的驱动程序,任何关于此的指针都会有所帮助。但是需要灵活的模式。
csv文件内容:
1,101,111
2,102,222
2,103,223
3,104,224
3,105,225
4,106,226
4,107,227
4,108,228
代码:
var MongoClient = require('mongodb').MongoClient;
var csv = require("fast-csv");
var index=0;
MongoClient.connect('mongodb://127.0.0.1:27017/database', function(err, db) {
if(err) throw err;
csv.fromPath("data.csv")
.on("record", function(data){
doc={};
doc[data[1]]=data[2];
db.collection("r").update(
{"rid":Number(data[0])},
{
"$setOnInsert": {
"_id": ++index
},
"$set":doc
},
{ "w":0, "upsert" :true }
);
})
.on("end", function(){
console.log("done");
});
});
输出:
{ "_id" : 1, "rid" : 1, "101" : "111" }
{ "_id" : 2, "rid" : 2, "102" : "222", "103" : "223" }
{ "_id" : 4, "rid" : 3, "104" : "224", "105" : "225" }
{ "_id" : 6, "rid" : 4, "106" : "226", "107" : "227", "108" : "228" }
必需的输出:
{ "_id" : 1, "rid" : 1, "101" : "111" }
{ "_id" : 2, "rid" : 2, "102" : "222", "103" : "223" }
{ "_id" : 3, "rid" : 3, "104" : "224", "105" : "225" }
{ "_id" : 4, "rid" : 4, "106" : "226", "107" : "227", "108" : "228" }