Bạn có thể giải quyết vấn đề này theo một số cách.
Trước tiên, nếu bạn có sẵn MongoDB 3.4 thì bạn có thể sử dụng "Xem" để biểu diễn tập hợp với nội dung mảng "un-wrap". "Chế độ xem" về cơ bản là một câu lệnh tổng hợp dường như là một tập hợp bình thường khi có liên quan đến hầu hết các hành động sử dụng một tập hợp.
Vì vậy, giả sử bộ sưu tập nguồn của bạn được gọi là "pages"
tại đây, sau đó bạn sẽ tạo "Chế độ xem" với:
db.createView("pageArray", "pages", [{ "$unwind": "$page_likes" }])
Sau đó, bạn có thể truy vấn bộ sưu tập như bình thường:
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"
}
}
Và sau đó phát hành mongoexport
như thể đó là một bộ sưu tập bình thường:
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
Tất nhiên là thêm --out
hoặc chuyển hướng tiêu chuẩn để thực sự xuất ra tệp.
Nếu MongoDB của bạn là phiên bản cũ hơn nhưng ít nhất có $out
có sẵn (từ MongoDB 2.6) sau đó ghi vào bộ sưu tập khác:
db.pages.aggregate([
{ "$unwind": "$page_likes" },
{ "$project": { "_id": 0 } },
{ "$out": "pagesArray" }
])
Sau đó, về cơ bản bạn chạy cùng một mongoexport
như trên vì nó cũng là một bộ sưu tập có thể truy cập được để làm như vậy.
Nếu bạn thực sự không muốn tạo "Chế độ xem" hoặc "bộ sưu tập khác", thì bạn có thể chỉ cần gửi một tập lệnh ngắn đến mongo
vỏ bọc. Mặc dù theo một cách rất khó hiểu:
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}`))'
Hoặc thậm chí không có aggregate()
và $unwind
ở tất cả:
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}`)))'
Điều này mang lại cho bạn cùng một đầu ra:
user_id,page_likes.id,page_likes.name
0939bf9w9804842f9f817ad100,859302873383,Hotdogs
0939bf9w9804842f9f817ad100,8593683902,Video Games
0939bf9w9804842f9f817ad100,849204859849028,Road Bikes
Cũng lưu ý rằng nếu bạn muốn hoặc "cần" một dấu phân tách khác với dấu phẩy ,
ở đây, thì một trong hai cách tiếp cận cuối cùng với shell có lẽ là cách tốt nhất. Vì đây là "được lập lịch" để thêm vào mongoexport
và mongoimport
với TOOLS-87
, nhưng tất nhiên là "vẫn chưa được giải quyết". Vì vậy, nếu bạn muốn đầu ra khác, thì bạn tự làm.