MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Importa i dati csv come array in mongodb usando mongoimport

Per me, il modo più semplice per capire come formattare il tuo "CSV" per mongoimport è semplicemente creare una raccolta, quindi utilizzare mongoexport su di esso per vedere come dovrebbe essere il formato CSV.

Quindi crea il tuo documento dalla shell:

db.newcol.insert({
  id:"122234343",
  name: "name1",
  children: ["222334444","333344444"]
})

Quindi esci dalla shell ed esegui mongoexport :

 mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv

Che ti mostrerà l'output come:

id,name,children
122234343,name1,"[""222334444"",""333344444""]"

Dove la "matrice" è rappresentata con una "stringa" e usando le virgolette "" nella loro forma sfuggita.

Questo ora è un posto abbastanza chiaro per usare mongoimport da, quindi "importa" ora per testare:

mongoimport -d test -c newcol --headerline --type csv out.csv

Rientra nella shell e visualizza i documenti nella nuova raccolta:

db.newcol.findOne()
{
        "_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
        "id" : 122234343,
        "name" : "name1",
        "children" : "[\"222334444\",\"333344444\"]"
}

Quindi è tutto lì, MA i figli sono elencati come una "stringa" piuttosto che un array. Ma questo non è davvero un problema, dal momento che abbiamo importato i dati e ora tocca a noi trasformarli effettivamente:

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 = [];
}

Quindi itererà tutto ciò che è stato importato nella raccolta che ha un tipo BSON di 2 che è "stringa" tramite il $type operatore di query.

Quindi prendiamo la stringa, la dividiamo come un array e rimuoviamo gli altri caratteri per lasciare solo il valore che desideri.

Usando .bulkWrite() commetti quegli aggiornamenti in modo efficiente, invece di scrivere ogni singolo documento per richiesta. In realtà vengono inviati in batch da 1000 al server.

Il risultato finale è il documento nella forma originale desiderata:

db.testcol.findOne()
{
        "_id" : ObjectId("5947652ccb237bd6e4e902a5"),
        "id" : "122234343",
        "name" : "name1",
        "children" : [
                "222334444",
                "333344444"
        ]
}

Quindi questo è il mio "passo dopo passo" su come elaborare il tuo formato CSV, importarlo e quindi "trasformare" i dati nello stato in cui ne hai bisogno.