MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Importar dados csv como array no mongodb usando mongoimport


Para mim, a maneira mais simples de descobrir como formatar seu "CSV" para mongoimport é simplesmente criar uma coleção e usar mongoexport nele para ver como deve ser o formato CSV.

Então crie seu documento a partir do shell:
db.newcol.insert({
  id:"122234343",
  name: "name1",
  children: ["222334444","333344444"]
})

Em seguida, saia do shell e execute mongoexport :
 mongoexport -d test -c testcol --fields id,name,children --type csv > out.csv

Que mostrará a saída como:
id,name,children
122234343,name1,"[""222334444"",""333344444""]"

Onde o "array" é representado com uma "string" e usando as aspas "" em sua forma escapada.

Isso agora é um lugar bem claro para usar mongoimport from, então apenas "importe" agora para testar:
mongoimport -d test -c newcol --headerline --type csv out.csv

Reinsira o shell e veja o(s) documento(s) na nova coleção:
db.newcol.findOne()
{
        "_id" : ObjectId("59476924d6eb0b7d6ac37e02"),
        "id" : 122234343,
        "name" : "name1",
        "children" : "[\"222334444\",\"333344444\"]"
}

Então está tudo lá, MAS os filhos são listados como uma "string" em vez de uma matriz. Mas isso não é realmente um problema, já que importamos os dados e agora só depende de nós transformá-los:
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 = [];
}

Então, isso vai iterar qualquer coisa que tenha sido importada para a coleção que tenha um tipo BSON de 2, que é "string" por meio do $type operador de consulta.

Em seguida, pegamos a string, dividimos como um array e tiramos os outros caracteres para deixar apenas o valor que você deseja.

Usando .bulkWrite() você confirma essas atualizações de maneira eficiente, em vez de escrever todos os documentos por solicitação. Na verdade, eles são enviados em lotes de 1.000 para o servidor.

O resultado final é o documento na forma original desejada:
db.testcol.findOne()
{
        "_id" : ObjectId("5947652ccb237bd6e4e902a5"),
        "id" : "122234343",
        "name" : "name1",
        "children" : [
                "222334444",
                "333344444"
        ]
}

Então, esse é o meu "passo a passo" de como você pode elaborar seu formato CSV, importá-lo e depois "transformar" os dados para o estado que você precisa.