sql >> Database >  >> NoSQL >> MongoDB

Importeer csv-gegevens als array in mongodb met behulp van mongoimport

Voor mij de eenvoudigste manier om erachter te komen hoe u uw "CSV" voor mongoimport moet formatteren is om eenvoudig een verzameling te maken en vervolgens mongoexport . te gebruiken erop om te zien hoe het CSV-formaat eruit zou moeten zien.

Maak dus uw document vanuit de shell:

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

Verlaat vervolgens de shell en voer mongoexport uit :

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

Wat u de uitvoer laat zien als:

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

Waar de "array" wordt weergegeven met een "string" en de aanhalingstekens gebruikt "" in hun ontsnapte vorm.

Dat is nu een vrij duidelijke plaats om mongoimport te gebruiken van, dus "importeer" nu gewoon om te testen:

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

Voer de shell opnieuw in en bekijk de documenten in de nieuwe verzameling:

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

Dus alles is er, MAAR de kinderen worden weergegeven als een "string" in plaats van als een array. Maar dit is niet echt een probleem, aangezien we de gegevens hebben geïmporteerd en het nu aan ons is om ze daadwerkelijk te transformeren:

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

Dus dat gaat alles herhalen dat in de collectie is geïmporteerd met een BSON-type 2 dat "string" is via de $type query-operator.

Dan nemen we de string, splitsen deze als een array en strippen de andere karakters om alleen de gewenste waarde over te laten.

.bulkWrite() gebruiken u voert die updates op een efficiënte manier uit, in plaats van elk afzonderlijk document per verzoek te schrijven. Ze worden feitelijk in batches van 1000 naar de server gestuurd.

Het eindresultaat is het document in de oorspronkelijke gewenste vorm:

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

Dus dat is mijn "stap voor stap" van hoe u uw CSV-formaat kunt uitwerken, het kunt importeren en vervolgens de gegevens kunt "transformeren" in de staat waarin u het nodig hebt.



  1. Welke MongoDB-gebruikersrechten heb ik nodig om een ​​gebruiker toe te voegen aan een nieuwe/andere mongo-database?

  2. Redis 10x meer geheugengebruik dan data

  3. Welke Python API moet worden gebruikt met Mongo DB en Django

  4. Overloop sorteerfase gebufferd datagebruik overschrijdt interne limiet