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.