Możesz sobie z tym poradzić na wiele sposobów.
Po pierwsze, jeśli masz dostęp do MongoDB 3.4, możesz użyć "Widoku" w celu reprezentowania kolekcji z zawartością tablicy "un-wound". „Widok” to w zasadzie instrukcja potoku agregacji, która wydaje się być normalną kolekcją, jeśli chodzi o większość działań, które używają kolekcji.
Zakładając więc, że Twoja kolekcja źródłowa nazywa się "pages"
tutaj utworzysz „Widok” za pomocą:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Następnie możesz normalnie wysłać zapytanie do kolekcji:
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"
}
}
A następnie wydaj mongoexport
jakby to była normalna kolekcja:
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
Oczywiście dodanie --out
lub standardowe przekierowanie do rzeczywistego wyjścia do pliku.
Jeśli twoja MongoDB jest starszą wersją, ale przynajmniej ma $out
dostępne ( z MongoDB 2.6 ), a następnie napisz do innej kolekcji:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Następnie w zasadzie uruchamiasz ten sam mongoexport
jak powyżej, ponieważ jest to również dostępna kolekcja.
Jeśli naprawdę nie chcesz tworzyć „widoku” ani „kolejnej kolekcji”, możesz po prostu wysłać krótki skrypt do mongo
powłoka. Choć w bardzo zwariowany sposób:
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}`))'
Lub nawet bez aggregate()
i $unwind
w ogóle:
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}`)))'
Co daje ten sam wynik:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Pamiętaj też, że jeśli chcesz lub „potrzebujesz” innego separatora niż przecinek ,
tutaj, wtedy jedno z dwóch ostatnich podejść do powłoki jest prawdopodobnie drogą do zrobienia. Ponieważ jest to "zaplanowane" dodawanie do mongoexport
i mongoimport
z TOOLS-87
, ale oczywiście „jeszcze nie rozwiązano”. Więc jeśli chcesz uzyskać inny wynik, zrób to sam.