2012-05-05 46 views
8

Tôi cần xuất các giá trị của các đối tượng trong một mảng thành CSV. Hãy nói rằng tài liệu của tôi là:Làm thế nào để tôi mongoexport thuộc tính từ một mảng các đối tượng để CSV?

 
{ 
    name:"test", 
    types:[ 
     {type:"A"}, 
     {type:"B"}, 
       {type:"C"} 
    ] 
} 

Mục tiêu của tôi là để sản xuất ra như:

 
"test", "A" 
"test", "B" 
"test", "C" 

Sau đây cũng sẽ được chấp nhận:

 
"test", "A,B,C" 

Tôi đang cố gắng để thực hiện thông qua này mongoexport sử dụng:

mongoexport -h localhost -d mydb -c mycollection -f name,types.type --csv

Thật không may, tôi nhận được:

"test",

tôi đã tìm thấy tài liệu về tham khảo các phần tử mảng cụ thể, như "types.0.type", nhưng chiều dài của mảng của tôi là chưa biết. Bất kỳ ý tưởng?

+0

Tôi có kịch bản chính xác như vậy. Tôi không muốn viết một kịch bản tùy chỉnh để xử lý điều này, bởi vì tôi muốn có trách nhiệm chính về các nhà phân tích dữ liệu của chúng tôi (những người có thể chạy mongoexport) thay vì nhóm phát triển của tôi. Bạn có thể tìm cách giải quyết vấn đề này không? – feathj

Trả lời

1

Bạn sẽ phải viết tập lệnh tùy chỉnh lặp qua bộ sưu tập và xuất tài liệu ở định dạng mong muốn. Mongoexport tích hợp không được thiết kế cho các trường hợp sử dụng như của bạn.

1

Nếu bạn hài lòng với Perl thì thư viện ARJsonLib.pm trong article sau đây, cung cấp phần lớn chức năng bạn cần để tạo đồ chơi nhỏ của riêng bạn. Lưu ý rằng phiên bản trong bài viết là một bài toán từ một món đồ chơi mà tôi đã tấn công cùng với những thứ bạn muốn cùng với một số thứ khác, nhưng không phải bài viết mongoDB thiếu một chức năng mà bạn cần, tìm các trường/khóa trong một MongoDB thu thập, và lưu trữ chúng trong một mảng, nhưng tầm thường để xây dựng lại, chỉ cần viết cho mình một cái gì đó mà kéo của n tài liệu từ bộ sưu tập của bạn, đẩy chúng vào một mảng và gọi findKeysInJsonColl(). Dù sao một vài chức năng sẽ mất một con trỏ MongoDB như tham số, và:

convertToDojoGrid() 
convertToExcel() 

Một lần nữa CSV đầu ra là mất tích, nhưng tầm thường để thêm trở lại convertToExcel().

ví dụ:

... 
my $iRows = convertToExcel("/tmp/test.xlsx", $oMongoData, "", \@aOutFields, "xlsx"); 
... 

đâu: $ oMongoData là một tài liệu tham khảo MongoDB Cursor và @aOutFields một mảng chứa các lĩnh vực/phím mà bạn muốn xuất hiện trên tấm cao su

1

Bạn có thể thực hiện những gì bạn đang cố gắng làm bằng hoạt động đường ống kết hợp MongoDB để xây dựng ra một bộ sưu tập tạm thời với các dữ liệu trong hình dạng bạn muốn xuất khẩu:

use mydb 
db.mycollection.aggregate([ 
          {$unwind: "$types"}, 
          {$project: { _id: 0, name: 1, type: "$types.type" } }, 
          {$out: "tmp4csv"} 
          ]); 

này sẽ tạo ra một bộ sưu tập tmp4csv trong đó có một tài liệu cho mỗi phần tử của mảng

i.e trong ví dụ của bạn (và thêm một giá trị _id như giá trị này phải được đưa vào xem xét trong dung đề nghị của tôi)

{ 
    _id: ObjectId("54e3ce75cb87e6d036287cc6"), 
    name:"test", 
    types:[ 
     {type:"A"}, 
     {type:"B"}, 
     {type:"C"} 
     ] 
} 

thông qua việc sử dụng các toán tử $ Thư giãn trở thành

{ _id: ObjectId("54e3ce75cb87e6d036287cc6"), name:"test", types:[ {type:"A"} ] }, 
{ _id: ObjectId("54e3ce75cb87e6d036287cc6"), name:"test", types:[ {type:"B"} ] }, 
{ _id: ObjectId("54e3ce75cb87e6d036287cc6"), name:"test", types:[ {type:"C"} ] } 

Tiếp theo $ nhà điều hành dự án được sử dụng để cải cách dữ liệu một chút - giải nén types.type thành loại và cung cấp một giá trị _id duy nhất mới cho mỗi tài liệu.

Cuối cùng, các tài liệu được tạo bởi đường ống tổng hợp được đưa vào bộ sưu tập "tmp4csv" bằng toán tử $ out. Nếu không có việc tạo ra một giá trị _id duy nhất trong bước trước, bước này sẽ thất bại do các khóa trùng lặp.

Sau đó bạn có thể xuất dữ liệu vào một tập tin đầu ra:

mongoexport -h localhost -d mydb -c tmp4csv -f name,type --csv --out output.csv 

Và để giữ cho mọi thứ sạch Sau đó tôi sẽ thả bộ sưu tập tmp4csv đã được tạo ra như một phần của việc này:

use mydb 
db.tmp4csv.drop() 

này nên cung cấp cho bạn tệp csv với định dạng đầu ra ưa thích của bạn.

Tài liệu tham khảo: Aggregation đường ống doc: http://docs.mongodb.org/manual/aggregation/ Thư giãn điều hành vì đây là chìa khóa: http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/

Các vấn đề liên quan