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

Importer csv-data som array i mongodb ved hjælp af mongoimport

For mig er den nemmeste måde at finde ud af, hvordan du formaterer din "CSV" til mongoimport er at oprette en samling og derefter bruge mongoexport på den for at se, hvordan CSV-formatet skal se ud.

Så opret dit dokument fra skallen:

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

Afslut derefter skallen og kør mongoexport :

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

Hvilket vil vise dig output som:

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

Hvor "array" er repræsenteret med en "streng" og ved hjælp af anførselstegn "" i deres undslupne form.

Det er nu et ret klart sted at bruge mongoimport fra, så bare "importer" nu for at teste:

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

Indtast skallen igen og se dokumentet/dokumenterne i den nye samling:

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

Så alt er der, MEN børnene er angivet som en "streng" i stedet for en række. Men dette er egentlig ikke et problem, da vi fik dataene importeret, og nu er det bare op til os at omdanne dem nu:

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

Så det vil gentage alt, der blev importeret til samlingen, der har en BSON type 2, som er "streng" via $type forespørgselsoperatør.

Så tager vi strengen, deler den op som et array og fjerner de andre tegn, så de kun efterlader den værdi, du ønsker.

Brug af .bulkWrite() du begår disse opdateringer på en effektiv måde i stedet for at skrive hvert enkelt dokument pr. anmodning. De sendes faktisk i batches af 1000 til serveren.

Slutresultatet er dokumentet i den oprindelige ønskede form:

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

Så det er mit "trin for trin" af, hvordan du kan udarbejde dit CSV-format, importere det og derefter "transformere" dataene til den tilstand, du har brug for det.



  1. Genbruger MongoDB slettet plads?

  2. Percona Live Frankfurt 2018 - Begivenhedsoversigt og vores sessioner

  3. Arbejder du med indlejrede objekter i Redis?

  4. Opdater indlejret objekt i array inde i array i MongoDB