Проблема обратного вызова обновления Nodejs Mongodb

Вопрос:

Я импортирую файл csv в mongodb с помощью драйвера mongodb и быстрого csv. Проблема в том, что для каждой записи мне нужно вставить эту запись в коллекцию, если эта запись отсутствует в коллекции и обновить ее в противном случае. Но какая запись существует или no определяется его идентификатором. Из этого идентификатора мне также требуется auto incrementing _id field.Csv, как показано.

1001,a,201
2001,b,202
2001,c,203
3001,d,204
3001,e,205

быстрый csv читает и передает обратный вызов в качестве данных.

data=[1001,a,201]

поэтому, когда первая запись считывается, она должна идти в db как

{ "_id":1,rid:"1001", "a":"101"}

вторая запись:

{ "_id":2, rid:"2001", "b":"102"}

теперь, когда третья запись будет считана как запись со сбросом: “2001” уже существует, он должен просто обновить запись, добавив в нее новый ключ: значение, то есть после обновления он должен быть:

{ "_id:2",rid:"2001","a":"101","c":"203"}.

Я использую $ setOnInsert: {_ id: index} в аргументе обновления метода обновления. $ SetOnInsert не будет иметь никакого эффекта, если запись уже существует. Теперь это в сочетании с настройкой upsert: true должно работать нормально. Но я не мог выяснить, как увеличить индекс. Сначала я попытался использовать метод подсчета и обновил запись в обратном вызове, но, поскольку у сторонника нет гарантии о том, когда выполняется обратный вызов, после вставки записи в следующий раз счет для этой записи по-прежнему отображается как 0. Возможно, эта проблема будет решена с использованием mongoose. В мангусте нам нужна схема. Но я хочу, чтобы в каждой записи было непонятное количество полей:

{_id:1,rid:"1001","a":"101","c":203","d":"208", .. , .. ,..}

query: fields = {} fields [data [1]] = data [2];

db.collection("collectionname").update(query,{$setOnInsert:{_id:++index},$set:fields},{upsert:true,w:0} );

Также требуется auto incrementing _id.so как доказать правильный индекс (прирост для новой записи)? Любые указатели на это были бы полезны даже при использовании другого драйвера. Однако нужна гибкая схема.

Содержимое файла 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" }

Оцените статью
TechArks.Ru
Добавить комментарий