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

Remodeler le tableau stocké dans une collection et exporter vers CSV

Vous pouvez gérer cela de plusieurs façons.

Tout d'abord, si vous disposez de MongoDB 3.4, vous pouvez utiliser une "View" afin de représenter la collection avec le contenu du tableau "déroulé". Une "vue" est essentiellement une instruction de pipeline d'agrégation qui semble être une collection normale en ce qui concerne la plupart des actions qui utiliseraient une collection.

Donc, en supposant que votre collection source s'appelle "pages" ici, alors vous créeriez la "Vue" avec :

db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])

Ensuite, vous pouvez interroger la collection comme d'habitude :

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"
    }
}

Et émettez ensuite le mongoexport comme s'il s'agissait d'une collection normale :

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

Bien sûr en ajoutant --out ou une redirection standard pour réellement sortir vers un fichier.

Si votre MongoDB est une ancienne version mais a au moins $out disponible (à partir de MongoDB 2.6) puis écrivez dans une autre collection :

db.pages.aggregate([
  { "$unwind": "$page_likes" },
  { "$project": { "_id": 0 } },
  { "$out": "pagesArray" }
])

Ensuite, vous exécutez essentiellement le même mongoexport comme ci-dessus car c'est aussi une collection accessible pour le faire.

Si vous ne voulez vraiment pas créer une "Vue" ou "une autre collection", vous pouvez simplement envoyer un court script au mongo coquille. Bien que d'une manière très hackeuse :

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 même sans aggregate() et $unwind du tout :

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}`)))'

Ce qui vous donne le même résultat :

user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes

Notez également que si vous voulez ou "avez besoin" d'un délimiteur différent de la virgule , ici, alors l'une ou l'autre des deux dernières approches avec la coquille est probablement la voie à suivre. Comme cela est "prévu" pour être ajouté à mongoexport et mongoimport avec TOOLS-87 , mais bien sûr "encore à résoudre". Donc, si vous voulez une sortie différente, faites-le vous-même.