Voor mij de eenvoudigste manier om erachter te komen hoe u uw "CSV" voor mongoimport
moet formatteren is om eenvoudig een verzameling te maken en vervolgens mongoexport
. te gebruiken erop om te zien hoe het CSV-formaat eruit zou moeten zien.
Maak dus uw document vanuit de shell:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
Verlaat vervolgens de shell en voer mongoexport
uit :
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
Wat u de uitvoer laat zien als:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
Waar de "array" wordt weergegeven met een "string" en de aanhalingstekens gebruikt ""
in hun ontsnapte vorm.
Dat is nu een vrij duidelijke plaats om mongoimport
te gebruiken van, dus "importeer" nu gewoon om te testen:
mongoimport -d test -c newcol --headerline --type csv out.csv
Voer de shell opnieuw in en bekijk de documenten in de nieuwe verzameling:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
Dus alles is er, MAAR de kinderen worden weergegeven als een "string" in plaats van als een array. Maar dit is niet echt een probleem, aangezien we de gegevens hebben geïmporteerd en het nu aan ons is om ze daadwerkelijk te transformeren:
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 = [];
}
Dus dat gaat alles herhalen dat in de collectie is geïmporteerd met een BSON-type 2 dat "string" is via de $type
query-operator.
Dan nemen we de string, splitsen deze als een array en strippen de andere karakters om alleen de gewenste waarde over te laten.
.bulkWrite()
gebruiken u voert die updates op een efficiënte manier uit, in plaats van elk afzonderlijk document per verzoek te schrijven. Ze worden feitelijk in batches van 1000 naar de server gestuurd.
Het eindresultaat is het document in de oorspronkelijke gewenste vorm:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
Dus dat is mijn "stap voor stap" van hoe u uw CSV-formaat kunt uitwerken, het kunt importeren en vervolgens de gegevens kunt "transformeren" in de staat waarin u het nodig hebt.