Anda dapat mengatasinya dengan beberapa cara.
Pertama jika Anda memiliki MongoDB 3.4 yang tersedia maka Anda dapat menggunakan "View" untuk merepresentasikan koleksi dengan isi array "un-wound". "Tampilan" pada dasarnya adalah pernyataan alur agregasi yang tampaknya merupakan kumpulan normal sejauh menyangkut sebagian besar tindakan yang akan menggunakan kumpulan.
Jadi anggaplah koleksi sumber Anda disebut "pages"
di sini, maka Anda akan membuat "Tampilan" dengan:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Kemudian Anda dapat menanyakan koleksi seperti biasa:
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"
}
}
Dan selanjutnya keluarkan mongoexport
seolah-olah itu adalah koleksi biasa:
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
Tentu saja menambahkan --out
atau pengalihan standar untuk benar-benar menghasilkan file.
Jika MongoDB Anda adalah versi yang lebih lama tetapi setidaknya memiliki $out
tersedia ( dari MongoDB 2.6 ) lalu tulis ke koleksi lain:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Maka pada dasarnya Anda menjalankan mongoexport
yang sama seperti di atas karena ini juga merupakan koleksi yang dapat diakses untuk melakukannya.
Jika Anda benar-benar tidak ingin membuat "Tampilan" atau "koleksi lain", Anda cukup mengirim skrip pendek ke mongo
kerang. Meskipun dengan cara yang sangat retas:
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}`))'
Atau bahkan tanpa aggregate()
dan $unwind
sama sekali:
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}`)))'
Yang memberi Anda hasil yang sama:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Perhatikan juga bahwa jika Anda ingin atau "membutuhkan" pembatas yang berbeda dari koma ,
di sini, maka salah satu dari dua pendekatan terakhir dengan shell mungkin adalah cara yang harus dilakukan. Karena ini "dijadwalkan" untuk penambahan mongoexport
dan mongoimport
dengan TOOLS-87
, tetapi tentu saja "belum diselesaikan". Jadi jika ingin hasil yang berbeda, lakukan sendiri.