Можете да се справите с това по няколко начина.
Първо, ако разполагате с MongoDB 3.4, тогава можете да използвате „Изглед“ за да се представи колекцията със съдържанието на масива "un-wind". „Изгледът“ е основно оператор за конвейер за агрегиране, който изглежда като нормална колекция, що се отнася до повечето действия, които биха използвали колекция.
Така че ако приемем, че вашата колекция източник се нарича "pages"
тук, тогава ще създадете „Изглед“ с:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
След това можете да направите запитване към колекцията както обикновено:
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"
}
}
И впоследствие издайте mongoexport
сякаш е нормална колекция:
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
Разбира се добавяне на --out
или стандартно пренасочване за действително извеждане във файл.
Ако вашата MongoDB е по-стара версия, но има поне $out
наличен (от MongoDB 2.6), след това запишете в друга колекция:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
След това основно изпълнявате същия mongoexport
както по-горе, тъй като това също е колекция, която е достъпна за това.
Ако наистина не искате да създавате нито „Изглед“, нито „друга колекция“, можете просто да изпратите кратък скрипт до mongo
черупка. Макар и по много хакерски начин:
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}`))'
Или дори без aggregate()
и $unwind
изобщо:
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}`)))'
Което ви дава същия резултат:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Имайте предвид също, че ако искате или се „нуждаете“ от разделител, различен от запетая ,
тук, тогава някой от последните два подхода с обвивката вероятно е правилният начин. Тъй като това е „планирано“ за добавяне към mongoexport
и mongoimport
с TOOLS-87
, но разбира се „все още не е разрешено“. Така че, ако искате различен резултат, направете го сами.