Sie können auf verschiedene Weise damit umgehen.
Erstens, wenn Sie MongoDB 3.4 zur Verfügung haben, können Sie einen "View" verwenden um die Sammlung mit dem Array-Inhalt "un-wound" darzustellen. Eine "Ansicht" ist im Grunde eine Aggregation-Pipeline-Anweisung, die für die meisten Aktionen, die eine Sammlung verwenden würden, eine normale Sammlung zu sein scheint.
Angenommen, Ihre Quellsammlung heißt "pages"
hier, dann würden Sie die "Ansicht" erstellen mit:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Dann können Sie die Sammlung wie gewohnt abfragen:
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"
}
}
Geben Sie anschließend mongoexport
aus als wäre es eine normale Sammlung:
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
Natürlich --out
hinzufügen
oder eine Standardumleitung zur tatsächlichen Ausgabe in eine Datei.
Wenn Ihre MongoDB eine ältere Version ist, aber mindestens $out
hat verfügbar (ab MongoDB 2.6 ), dann in eine andere Sammlung schreiben:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Dann führen Sie im Grunde denselben mongoexport
aus wie oben, da es sich auch um eine Sammlung handelt, auf die zugegriffen werden kann.
Wenn Sie wirklich weder eine "Ansicht" noch eine "andere Sammlung" erstellen möchten, können Sie einfach ein kurzes Skript an mongo
senden Hülse. Wenn auch auf sehr abgehackte Weise:
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}`))'
Oder sogar ohne aggregate()
und $unwind
überhaupt:
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}`)))'
Was Ihnen die gleiche Ausgabe gibt:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Beachten Sie auch, dass Sie ein anderes Trennzeichen als Komma ,
wollen oder "benötigen". hier, dann ist wahrscheinlich einer der beiden letzten Ansätze mit der Shell der richtige Weg. Da dies für die Hinzufügung zu mongoexport
"geplant" ist und mongoimport
mit TOOLS-87
, ist aber natürlich "noch zu lösen". Wenn Sie also eine andere Ausgabe wünschen, können Sie dies selbst tun.