MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Importer des données csv en tant que tableau dans mongodb à l'aide de mongoimport

Pour moi, le moyen le plus simple de déterminer comment formater votre "CSV" pour mongoimport est de simplement créer une collection puis d'utiliser mongoexport dessus pour voir à quoi devrait ressembler le format CSV.

Créez donc votre document depuis le shell :

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

Quittez ensuite le shell et exécutez mongoexport :

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

Ce qui vous montrera la sortie comme :

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

Où le "tableau" est représenté par une "chaîne" et en utilisant les guillemets "" sous leur forme échappée.

C'est maintenant un endroit assez clair pour utiliser mongoimport à partir de, alors "importez" maintenant pour tester :

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

Entrez à nouveau dans le shell et voyez le(s) document(s) dans la nouvelle collection :

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

Donc tout est là, MAIS les enfants sont répertoriés sous la forme d'une "chaîne" plutôt que d'un tableau. Mais ce n'est pas vraiment un problème, puisque nous avons importé les données et maintenant c'est à nous de les transformer :

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

Donc, cela va itérer tout ce qui a été importé dans la collection qui a un type BSON de 2 qui est "string" via le $type opérateur de requête.

Ensuite, nous prenons la chaîne, la divisons en tableau et supprimons les autres caractères pour ne laisser que la valeur souhaitée.

Utilisation de .bulkWrite() vous validez ces mises à jour de manière efficace, plutôt que d'écrire chaque document par demande. Ils sont en fait envoyés par lots de 1000 au serveur.

Le résultat final est le document sous la forme souhaitée d'origine :

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

Voilà donc mon "étape par étape" de la façon dont vous pouvez travailler votre format CSV, l'importer puis "transformer" les données dans l'état dont vous avez besoin.