sql >> Databasteknik >  >> NoSQL >> MongoDB

Importera csv-data som array i mongodb med mongoimport

För mig är det enklaste sättet att ta reda på hur du formaterar din "CSV" för mongoimport är att helt enkelt skapa en samling och sedan använda mongoexport på den för att se hur CSV-formatet ska se ut.

Så skapa ditt dokument från skalet:

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

Avsluta sedan skalet och kör mongoexport :

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

Vilket visar utdata som:

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

Där "matrisen" representeras med en "sträng" och med citattecken "" i sin förrymda form.

Det är nu en ganska tydlig plats att använda mongoimport från, så bara "importera" nu för att testa:

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

Gå in i skalet igen och se dokumentet/dokumenten i den nya samlingen:

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

Så allt finns där, MEN barnen listas som en "sträng" snarare än en array. Men detta är egentligen inget problem, eftersom vi har importerat data och nu är det bara upp oss att nu faktiskt omvandla det:

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 kommer att upprepa allt som importerades till samlingen som har en BSON-typ 2 som är "sträng" via $type frågeoperator.

Sedan tar vi strängen, delar upp den som en array och tar bort de andra tecknen för att bara lämna det värde du vill ha.

Använder .bulkWrite() du genomför dessa uppdateringar på ett effektivt sätt, snarare än att skriva varje enskilt dokument per begäran. De skickas faktiskt i omgångar om 1000 till servern.

Slutresultatet är dokumentet i den ursprungliga önskade formen:

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

Så det är mitt "steg för steg" om hur du kan räkna ut ditt CSV-format, importera det och sedan "omvandla" data till det tillstånd du behöver det.



  1. Hur sammanfogar man matriser från flera dokument i MongoDB?

  2. Hur man bygger en URL Shortener med Node.js och MongoDB

  3. Varför ska jag stänga eller hålla Redis-anslutningar öppna?

  4. Laravel Caching med Redis är väldigt långsam