Para mí, la forma más sencilla de averiguar cómo formatear su "CSV" para mongoimport
es simplemente crear una colección y luego usar mongoexport
en él para ver cómo debería ser el formato CSV.
Así que crea tu documento desde el shell:
db.newcol.insert({
id:"122234343",
name: "name1",
children: ["222334444","333344444"]
})
Luego salga del shell y ejecute mongoexport
:
mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv
Que le mostrará la salida como:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"
Donde la "matriz" se representa con una "cadena" y usando las comillas ""
en su forma escapada.
Ese ahora es un lugar bastante claro para usar mongoimport
from, así que simplemente "importar" ahora para probar:
mongoimport -d test -c newcol --headerline --type csv out.csv
Vuelva a ingresar al shell y vea los documentos en la nueva colección:
db.newcol.findOne()
{
"_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
"id" : 122234343,
"name" : "name1",
"children" : "[\"222334444\",\"333344444\"]"
}
Así que todo está ahí, PERO los hijos se enumeran como una "cadena" en lugar de una matriz. Pero esto no es realmente un problema, ya que importamos los datos y ahora solo depende de nosotros transformarlos:
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 = [];
}
Eso va a iterar todo lo que se importó a la colección que tiene un tipo BSON de 2 que es "cadena" a través del $type
operador de consulta.
Luego tomamos la cadena, la dividimos como una matriz y eliminamos los otros caracteres para dejar solo el valor que desea.
Usando .bulkWrite()
usted confirma esas actualizaciones de una manera eficiente, en lugar de escribir cada documento por solicitud. En realidad, se envían en lotes de 1000 al servidor.
El resultado final es el documento en el formato deseado original:
db.testcol.findOne()
{
"_id" : ObjectId("5947652ccb237bd6e4e902a5"),
"id" : "122234343",
"name" : "name1",
"children" : [
"222334444",
"333344444"
]
}
Así que ese es mi "paso a paso" de cómo puede resolver su formato CSV, importarlo y luego "transformar" los datos al estado que los necesita.