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.