sql >> Databáze >  >> NoSQL >> MongoDB

Importujte data csv jako pole v mongodb pomocí mongoimport

Pro mě je to nejjednodušší způsob, jak zjistit, jak naformátovat soubor „CSV“ pro mongoimport je jednoduše vytvořit kolekci a poté použít mongoexport na něm, abyste viděli, jak by měl vypadat formát CSV.

Vytvořte tedy svůj dokument z shellu:

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

Poté opusťte shell a spusťte mongoexport :

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

Což vám ukáže výstup jako:

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

Kde je "pole" reprezentováno "řetězcem" a pomocí uvozovek "" v jejich uniklé podobě.

To je nyní docela jasné místo pro použití mongoimport od, takže stačí "importovat" nyní k testování:

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

Znovu zadejte shell a podívejte se na dokumenty v nové kolekci:

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

Takže tam je všechno, ALE děti jsou uvedeny jako "řetězec" spíše než pole. Ale to ve skutečnosti není problém, protože jsme data importovali a nyní je jen na nás, abychom je skutečně transformovali:

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

Takže to bude iterovat vše, co bylo importováno do kolekce, která má typ BSON 2, což je "řetězec" přes $type operátor dotazu.

Potom vezmeme řetězec, rozdělíme jej jako pole a odstraníme ostatní znaky, aby zůstala pouze hodnota, kterou chcete.

Pomocí .bulkWrite() tyto aktualizace zasíláte efektivním způsobem, namísto psaní každého jednotlivého dokumentu na žádost. Ve skutečnosti jsou odesílány v dávkách po 1000 na server.

Konečným výsledkem je dokument v původní požadované podobě:

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

Takže to je můj "krok za krokem", jak si můžete vypracovat svůj CSV formát, importovat jej a poté "transformovat" data do stavu, který potřebujete.



  1. Docker-compose – Redis na 0.0.0.0 místo 127.0.0.1

  2. Meteor Subscribe neaktualizuje pořadí řazení kolekce

  3. MongoDB Index na různých typech

  4. Připojení ke clusteru Redis se nezdařilo