2012-05-05 27 views
8

Potrzebuję wyeksportować wartości obiektów w tablicy do pliku CSV. Powiedzmy, że mój dokument jest:Jak mongoexport atrybuty z tablicy obiektów do pliku CSV?

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

Moim celem jest, aby produkować wyjście jak:

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

Poniższy będzie również dopuszczalne:

 
"test", "A,B,C" 

Staram się to osiągnąć poprzez mongoexport za pomocą:

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

Niestety, Dostaję:

"test",

Znalazłem dokumentację na przedstawieniu konkretnych elementów tablicy, na przykład „types.0.type”, ale długość mojej tablicy jest nieznany. Jakieś pomysły?

+0

mam dokładnie ten sam scenariusz. Wolałbym raczej nie pisać skryptu niestandardowego, aby sobie z tym poradzić, ponieważ chcę, aby główna odpowiedzialność spoczywała na naszych analitykach danych (którzy mogą uruchamiać Mongoexport), a nie na moim zespole programistycznym. Czy byłeś w stanie znaleźć obejście tego problemu? – feathj

Odpowiedz

1

Będziesz musiał napisać niestandardowy skrypt, który będzie iterować za pomocą kolekcji i eksportować dokumenty w wybranym formacie. Wbudowany system mongoexport nie został zaprojektowany z myślą o takich przypadkach jak twój.

1

Jeśli zadowolony z Perl następnie biblioteka ARJsonLib.pm w następującym article, zapewnia większość funkcjonalności, czego potrzeba, aby stworzyć swoją własną, małą zabawkę. Zauważ, że wersja w tym artykule jest skrótem od zhakowanej zabawki, która robi dokładnie to, co chcesz, wraz z innymi rzeczami, ale jako że nie jest to artykuł mongoDB, brakuje jednej funkcji, której potrzebujesz, która znajduje pola/klucze w Kolekcja mongoDB, i przechowuje je w tablicy, ale trywialne do rekonstrukcji, po prostu napisz coś, co wyciągnie dokumenty z kolekcji, popchnie je do tablicy i wywoła findKeysInJsonColl(). W każdym razie kilka funkcji zajmie kursor MongoDB jako parametr, oraz:

convertToDojoGrid() 
convertToExcel() 

Znowu CSV wyjściowa wynosi brakuje, ale trywialna, aby dodać z powrotem do convertToExcel().

np.

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

Gdzie: $ oMongoData jest odniesienie MongoDB Cursor i @aOutFields tablicę zawierającą Pola/klucze chcesz pojawić się w arkuszu,

1

można osiągnąć co się chce zrobić za pomocą przycisków operacje rurociągów agregacja MongoDB, aby zbudować tymczasowy zbiór z danymi w kształcie chcesz wywozu:

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

to stworzy kolekcję tmp4csv który zawiera dokument dla każdego elementu tablicy

i.e na swoim przykładzie (i dodanie wartości _id jako tej wartości musi być brane pod uwagę w moim sugerowanej roztworu)

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

poprzez wykorzystanie operatora $ rozwijania staje

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

Następnie $ Operator projektu służy do nieznacznej reformy danych - rozpakowaniu typów.typ na typ i dostarczeniu nowej unikalnej wartości _id dla każdego dokumentu.

Wreszcie dokumenty wygenerowane przez potok agregacji są wyprowadzane do kolekcji "tmp4csv" za pomocą operatora $ out. Bez utworzenia unikalnej wartości _id w poprzednim kroku krok ten zakończyłby się niepowodzeniem z powodu duplikowania kluczy.

można następnie wyeksportować dane do pliku wyjściowego:

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

A do utrzymania w czystości wszystko bym wtedy upuść kolekcję tmp4csv, który został utworzony w ramach tego:

use mydb 
db.tmp4csv.drop() 

ten powinien dać ci plik csv z preferowanym formatem wyjściowym.

Referencje: Agregacja rurociąg Doc: http://docs.mongodb.org/manual/aggregation/ Unwind operatora to jest klucz: http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/