Para mim, a maneira mais simples de descobrir como formatar seu "CSV" para
mongoimport
é simplesmente criar uma coleção e usar mongoexport
nele para ver como deve ser o formato CSV. Então crie seu documento a partir do shell:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
Em seguida, saia do shell e execute
mongoexport
: mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
Que mostrará a saída como:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
Onde o "array" é representado com uma "string" e usando as aspas
""
em sua forma escapada. Isso agora é um lugar bem claro para usar
mongoimport
from, então apenas "importe" agora para testar:mongoimport -d test -c newcol --headerline --type csv out.csv
Reinsira o shell e veja o(s) documento(s) na nova coleção:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
Então está tudo lá, MAS os filhos são listados como uma "string" em vez de uma matriz. Mas isso não é realmente um problema, já que importamos os dados e agora só depende de nós transformá-los:
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 = [];
}
Então, isso vai iterar qualquer coisa que tenha sido importada para a coleção que tenha um tipo BSON de 2, que é "string" por meio do
$type
operador de consulta. Em seguida, pegamos a string, dividimos como um array e tiramos os outros caracteres para deixar apenas o valor que você deseja.
Usando
.bulkWrite()
você confirma essas atualizações de maneira eficiente, em vez de escrever todos os documentos por solicitação. Na verdade, eles são enviados em lotes de 1.000 para o servidor. O resultado final é o documento na forma original desejada:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
Então, esse é o meu "passo a passo" de como você pode elaborar seu formato CSV, importá-lo e depois "transformar" os dados para o estado que você precisa.