Puoi affrontarlo in diversi modi.
Innanzitutto, se hai MongoDB 3.4 disponibile, puoi utilizzare un "View" per rappresentare la collezione con il contenuto dell'array "un-wound". Una "Vista" è fondamentalmente un'istruzione della pipeline di aggregazione che sembra essere una raccolta normale per quanto riguarda la maggior parte delle azioni che utilizzerebbe una raccolta.
Quindi supponendo che la tua raccolta di origine si chiami "pages"
qui, quindi creeresti la "Vista" con:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Quindi puoi interrogare la raccolta 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 successivamente emettere il mongoexport
come se fosse una normale collezione:
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
Ovviamente aggiungendo --out
o un reindirizzamento standard per l'output effettivo su un file.
Se il tuo MongoDB è una versione precedente ma almeno ha $out
disponibile ( da MongoDB 2.6 ) quindi scrivi in un'altra raccolta:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Quindi esegui praticamente lo stesso mongoexport
come sopra poiché è anche una raccolta accessibile per farlo.
Se davvero non vuoi creare né una "Visualizza" né "un'altra raccolta", puoi semplicemente inviare un breve script a mongo
guscio. Anche se in modo molto ingannevole:
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}`))'
O anche senza aggregate()
e $unwind
affatto:
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}`)))'
Che ti dà lo stesso output:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Nota anche che se vuoi o "hai bisogno" di un delimitatore diverso dalla virgola ,
qui, quindi uno degli ultimi due approcci con la shell è probabilmente la strada da percorrere. Poiché questo è "programmato" per l'aggiunta a mongoexport
e mongoimport
con TOOLS-87
, ma ovviamente è "ancora da risolvere". Quindi, se vuoi un output diverso, fallo da solo.