sql >> Base de Datos >  >> NoSQL >> MongoDB

Importe datos csv como matriz en mongodb usando mongoimport

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.