Du kan hantera detta på flera sätt.
För det första om du har MongoDB 3.4 tillgängligt kan du använda en "View" för att representera samlingen med arrayinnehållet "un-wound". En "View" är i grunden en aggregeringspipeline-sats som verkar vara en normal samling vad gäller de flesta åtgärder som skulle använda en samling.
Så förutsatt att din källsamling kallas "pages"
här, då skulle du skapa "vyn" med:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Sedan kan du fråga samlingen som vanligt:
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"
}
}
Och utfärda sedan mongoexport
som om det vore en vanlig samling:
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
Naturligtvis lägga till --out
eller en standardomdirigering för att faktiskt mata ut till en fil.
Om din MongoDB är en äldre version men åtminstone har $out
tillgänglig (från MongoDB 2.6) skriv sedan till en annan samling:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Då kör du i princip samma mongoexport
som ovan eftersom det också är en samling som är tillgänglig för att göra det.
Om du verkligen inte vill skapa varken en "Visa" eller "en annan samling", kan du helt enkelt skicka ett kort skript till mongo
skal. Om än på ett väldigt hackigt sätt:
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}`))'
Eller till och med utan aggregate()
och $unwind
alls:
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}`)))'
Vilket ger dig samma utdata:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Observera också att om du vill ha eller "behöver" en annan avgränsare än komma ,
här, då är förmodligen någon av de två sista infallsvägarna med skalet rätt väg att gå. Eftersom detta är "schemalagt" för tillägg till mongoexport
och mongoimport
med TOOLS-87
, men är naturligtvis "ännu inte löst". Så om du vill ha olika utdata, så gör du det själv.