За мен най-простият начин да разберете как да форматирате своя "CSV" за mongoimport
е просто да създадете колекция, след което да използвате mongoexport
върху него, за да видите как трябва да изглежда CSV форматът.
Така че създайте своя документ от обвивката:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
След това излезте от обвивката и стартирайте mongoexport
:
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
Което ще ви покаже изхода като:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
Където "масивът" е представен с "низ" и използвайки кавичките ""
в избягалата им форма.
Това сега е доста ясно място за използване на mongoimport
от, така че просто „импортирайте“ сега, за да тествате:
mongoimport -d test -c newcol --headerline --type csv out.csv
Влезте отново в обвивката и вижте документа(ите) в новата колекция:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
Така че всичко е налице,НО децата са посочени като "низ", а не като масив. Но това всъщност не е проблем, тъй като имаме импортирани данни и сега остава само да ги трансформираме:
var ops = [];
db.testcol.find({ "children": { "$type": 2} }).forEach(doc => {
var children = doc.children.split(',').map( e => e.replace(/"|\[|\]|\\/gm,'').toString() );
ops.push({
"updateOne": {
"filter": { "_id": doc._id },
"update": { "$set": { "children": children } }
}
});
if ( ops.length >= 1000 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
});
if ( ops.length > 0 ) {
db.newcol.bulkWrite(ops);
ops = [];
}
Така че това ще повтори всичко, което е било импортирано в колекцията, което има тип BSON от 2, който е "низ" чрез $type
оператор на заявка.
След това вземаме низа, разделяме го като масив и премахваме останалите знаци, за да оставим само желаната от вас стойност.
Използване на .bulkWrite()
Вие извършвате тези актуализации по ефективен начин, вместо да пишете всеки един документ на заявка. Те всъщност се изпращат на партиди от 1000 до сървъра.
Крайният резултат е документът в оригиналната желана форма:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
Така че това е моята „стъпка по стъпка“ за това как можете да разработите своя CSV формат, да го импортирате и след това да „трансформирате“ данните в състоянието, в което имате нужда.