Как я могу mongoexport атрибуты из массива объектов в CSV?

Мне нужно экспортировать значения объектов в массиве в CSV. Допустим, мой документ:

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

Моя цель состоит в том, чтобы произвести продукцию как:

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

Следующее также будет приемлемо:

"test", "A,B,C"

Я пытаюсь сделать это через mongoexport, используя:

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

К сожалению, я получаю:

"test",

Я нашел документацию по ссылкам на конкретные элементы массива, например «types.0.type», но длина моего массива неизвестна. Есть идеи?

 feathj27 июн. 2012 г., 16:11
У меня точно такой же сценарий. Я бы предпочел не писать собственный сценарий для этого, потому что я хочу, чтобы основная ответственность была за наших аналитиков данных (которые могут запускать mongoexport), а не за мою команду разработчиков. Вы смогли найти обходной путь для этого?

Ответы на вопрос(3)

Если вы довольныPerl затем библиотека ARJsonLib.pm в следующемстатьяобеспечивает большую часть функциональности, которая вам понадобится для создания своей маленькой игрушки. Обратите внимание, что версия в статье - это заглушка из игрушки, которую я взломал вместе, которая делает именно то, что вам нужно, вместе с некоторыми другими вещами, но в отличие от статьи mongoDB, в ней отсутствует одна функция, которая вам понадобится, которая находит поля / ключи в коллекции mongoDB и сохраняет их в массиве, но для простоты реконструкции просто напишите себе что-то, что тянетn документы из вашей коллекции, помещает их в массив и вызывает findKeysInJsonColl (). В любом случае пара функций будет принимать курсор MongoDB в качестве параметра и:

convertToDojoGrid()
convertToExcel()

ОпятьCSV вывод отсутствует, но тривиально добавить обратно в convertToExcel ().

например

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

Где: $ oMongoData - ссылка на курсор MongoDB, а @aOutFields - массив, содержащий поля / ключи, которые вы хотите отобразить на листе,

который выполняет итерации по коллекциям и экспортирует документы в желаемом формате. Встроенный mongoexport не был разработан для таких случаев, как ваш.

что вы пытаетесь сделать, используя операции конвейера агрегации MongoDb для создания временной коллекции с данными в форме, которую вы хотите экспортировать:

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

это создаст коллекцию tmp4csv, которая содержит документ для каждого элемента массива

т.е. в вашем примере (и добавление значения _id, так как это значение должно учитываться в предложенном мной решении)

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

с помощью оператора $ unwind становится

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

Затем оператор $ project используется для небольшого преобразования данных - распаковки types.type в type и предоставления нового уникального значения _id для каждого документа.

Наконец, документы, сгенерированные конвейером агрегации, выводятся в «tmp4csv». коллекция с использованием оператора $ out. Без создания уникального значения _id на предыдущем шаге этот шаг не выполнен из-за дублирования ключей.

Затем вы можете экспортировать данные в выходной файл:

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

И чтобы сохранить все в чистоте, я бы удалил коллекцию tmp4csv, которая была создана как часть этого:

use mydb
db.tmp4csv.drop()

Это должно дать вам CSV-файл с предпочитаемым форматом вывода.

Рекомендации: Агрегационный конвейер doc:http://docs.mongodb.org/manual/aggregation/ Размотайте оператор, так как это ключ:http://docs.mongodb.org/manual/reference/operator/aggregation/unwind/

Ваш ответ на вопрос