MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Định hình lại mảng được lưu trữ trong bộ sưu tập và xuất sang CSV

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()$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 mongoexportmongoimport 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.




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Vấn đề về độ chính xác thời gian khi so sánh trong trình điều khiển mongodb trong Go và có thể ở ngôn ngữ khác và cơ sở dữ liệu khác

  2. Angular2 ExpressJs - Tải tệp lên máy chủ

  3. Cập nhật danh sách các tài liệu được nhúng trong mongoengine

  4. Cập nhật nhiều phần tử trong một mảng trong mongodb

  5. Số lượng đồng xuất hiện bằng cách sử dụng khung tổng hợp Mongo