Je kunt hier op verschillende manieren mee omgaan.
Ten eerste, als je MongoDB 3.4 beschikbaar hebt, kun je een "View" gebruiken om de collectie weer te geven met de array-inhoud "un-wound". Een "Weergave" is in feite een aggregatiepijplijninstructie die een normale verzameling lijkt te zijn voor zover het de meeste acties betreft die een verzameling zouden gebruiken.
Dus in de veronderstelling dat uw bronverzameling "pages"
wordt genoemd hier, dan zou je de "View" maken met:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Vervolgens kunt u de verzameling op de normale manier opvragen:
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"
}
}
En geef vervolgens de mongoexport
. uit alsof het een normale verzameling is:
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
Natuurlijk toevoegen van --out
of een standaard omleiding om daadwerkelijk naar een bestand te gaan.
Als uw MongoDB een oudere versie is maar tenminste $out
. heeft beschikbaar (vanaf MongoDB 2.6) en schrijf vervolgens naar een andere verzameling:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Dan voer je in principe dezelfde mongoexport
uit zoals hierboven, omdat het ook een verzameling is die hiervoor toegankelijk is.
Als je echt geen "View" of "een andere collectie" wilt maken, dan kun je gewoon een kort script naar de mongo
sturen. schelp. Zij het op een zeer hacky manier:
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}`))'
Of zelfs zonder aggregate()
en $unwind
helemaal niet:
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}`)))'
Wat je dezelfde output geeft:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Merk ook op dat als je een ander scheidingsteken wilt of "nodig hebt" dan de komma ,
hier, dan is een van de twee laatste benaderingen met de schaal waarschijnlijk de beste keuze. Aangezien dit is "gepland" voor toevoeging aan mongoexport
en mongoimport
met TOOLS-87
, maar is natuurlijk "nog niet opgelost". Dus als je een andere output wilt, dan doe je dat zelf.