MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Importieren Sie CSV-Daten als Array in Mongodb mit Mongoimport

Für mich der einfachste Weg, um herauszufinden, wie Sie Ihre "CSV" für mongoimport formatieren ist, einfach eine Sammlung zu erstellen und dann mongoexport zu verwenden darauf, um zu sehen, wie das CSV-Format aussehen sollte.

Erstellen Sie also Ihr Dokument aus der Shell:

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

Verlassen Sie dann die Shell und führen Sie mongoexport aus :

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

Das zeigt Ihnen die Ausgabe als:

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

Wobei das "Array" mit einem "String" und den Anführungszeichen "" dargestellt wird in ihrer entkommenen Form.

Das ist jetzt ein ziemlich klarer Ort, um mongoimport zu verwenden aus, also jetzt einfach "importieren" zum testen:

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

Rufen Sie die Shell erneut auf und sehen Sie sich die Dokumente in der neuen Sammlung an:

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

Also alles da, ABER Die untergeordneten Elemente werden als "String" und nicht als Array aufgeführt. Aber das ist nicht wirklich ein Problem, da wir die Daten importiert haben und es jetzt nur noch an uns liegt, sie jetzt tatsächlich zu transformieren:

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

Das wird also alles iterieren, was in die Sammlung importiert wurde und einen BSON-Typ von 2 hat, der "String" über den $type ist Abfrageoperator.

Dann nehmen wir den String, teilen ihn als Array auf und entfernen die anderen Zeichen, um nur den gewünschten Wert zu hinterlassen.

Verwenden von .bulkWrite() Sie übernehmen diese Aktualisierungen auf effiziente Weise, anstatt jedes einzelne Dokument pro Anfrage zu schreiben. Sie werden tatsächlich in Stapeln von 1000 an den Server gesendet.

Das Endergebnis ist das Dokument in der ursprünglich gewünschten Form:

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

Das ist also mein "Schritt für Schritt", wie Sie Ihr CSV-Format ausarbeiten, importieren und dann die Daten in den Zustand "transformieren", den Sie benötigen.