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

Remodelar a matriz armazenada em uma coleção e exportar para CSV


Você pode lidar com isso de várias maneiras.

Em primeiro lugar, se você tiver o MongoDB 3.4 disponível, poderá usar um "View" para representar a coleção com o conteúdo do array "un-wound". Uma "Visualização" é basicamente uma instrução de pipeline de agregação que parece ser uma coleção normal no que diz respeito à maioria das ações que usariam uma coleção.

Portanto, presumindo que sua coleção de fontes seja chamada de "pages" aqui, então você criaria a "Visualização" com:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])

Então você pode consultar a coleção normalmente:
db.pageArray.find()

/* 1 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "859302873383",
        "name" : "Hotdogs"
    }
}

/* 2 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "8593683902",
        "name" : "Video Games"
    }
}

/* 3 */
{
    "_id" : ObjectId("4725bf8731b8faf4c04595bb"),
    "user_id" : "0939bf9w9804842f9f817ad100",
    "page_likes" : {
        "id" : "849204859849028",
        "name" : "Road Bikes"
    }
}

E, posteriormente, emita o mongoexport como se fosse uma coleção normal:
mongoexport -d test -c pageArray --type=csv --fields user_id,page_likes.id,page_likes.name
2017-07-05T13:14:11.588+1000    connected to: localhost
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
2017-07-05T13:14:11.589+1000    exported 3 records

Claro, adicionando --out ou um redirecionamento padrão para realmente sair para um arquivo.

Se o seu MongoDB for uma versão mais antiga, mas pelo menos tiver $out disponível ( do MongoDB 2.6 ) e escreva em outra coleção:
db.pages.aggregate([
  { "$unwind": "$page_likes" },
  { "$project": { "_id": 0 } },
  { "$out": "pagesArray" }
])

Então você basicamente executa o mesmo mongoexport como acima, pois também é uma coleção acessível para fazê-lo.

Se você realmente não deseja criar uma "Visualização" ou "outra coleção", basta enviar um pequeno script para o mongo Concha. Embora de uma maneira muito hacky:
mongo --quiet --eval '
    print("user_id,page_likes.id,page_likes.name");
    db.pages.aggregate([ 
      { "$unwind": "$page_likes" },
      { "$project": { "_id": 0 } },
    ]).forEach(p => print(`${p.user_id},${p.page_likes.id},${p.page_likes.name}`))'

Ou mesmo sem aggregate() e $unwind de forma alguma:
mongo --quiet --eval '
    print("user_id,page_likes.id,page_likes.name");
    db.pages.find({},{ _id: 0 }).forEach(p =>
       p.page_likes.forEach(l => print(`${p.user_id},${l.id},${l.name}`)))'

O que lhe dá a mesma saída:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes

Observe também que, se você quiser ou "precisar" de um delimitador diferente da vírgula , aqui, então qualquer uma das duas últimas abordagens com o shell é provavelmente o caminho a seguir. Como isso está "agendado" para adição ao mongoexport e mongoimport com TOOLS-87 , mas é claro que "ainda está para ser resolvido". Então, se você quiser uma saída diferente, faça você mesmo.