Du kan håndtere dette på en række måder.
For det første, hvis du har MongoDB 3.4 tilgængelig, kan du bruge en "View" for at repræsentere samlingen med array-indholdet "un-wound". En "visning" er dybest set en aggregeringspipeline-erklæring, der ser ud til at være en normal samling, hvad angår de fleste handlinger, der ville bruge en samling.
Så hvis du antager, at din kildesamling hedder "pages"
her, så ville du oprette "View" med:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Derefter kan du forespørge samlingen som normalt:
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"
}
}
Og udsted derefter mongoexport
som om det var en normal 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
Selvfølgelig tilføjer --out
eller en standard omdirigering til faktisk at output til en fil.
Hvis din MongoDB er en ældre version, men i det mindste har $out
tilgængelig (fra MongoDB 2.6), så skriv til en anden samling:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Så kører du stort set den samme mongoexport
som ovenfor, da det også er en samling, der er tilgængelig for at gøre det.
Hvis du virkelig ikke ønsker at oprette enten en "View" eller "en anden samling", så kan du blot sende et kort script til mongo
skal. Omend på en meget hacky måde:
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 endda uden aggregate()
og $unwind
overhovedet:
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}`)))'
Hvilket giver dig det samme output:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Bemærk også, at hvis du ønsker eller "bruger" et andet skilletegn end komma ,
her, så er en af de to sidste tilgange med skallen nok vejen at gå. Da dette er "planlagt" til tilføjelse til mongoexport
og mongoimport
med TOOLS-87
, men er selvfølgelig "endnu ikke løst". Så hvis du vil have anderledes output, så gør du det selv.