Имя файла импорта mongodb в качестве дополнительного поля?

У меня есть большое количество CSV-файлов, которые я хотел бы загрузить в MongoDB. Что я хотел бы сделать (для тестирования и передачи данных), так это загрузить имя файла, из которого были получены записи, в качестве дополнительного поля в документе. просмотрел синтаксис mongoimport, но сделать это там не представляется возможным.

Мне нужен файл csv (т. е. users1.csv), содержащий USERID, NAME, EMAIL 1, John, [email protected].

Который будет загружен в коллекцию с _ID,USERID,NAME,EMAIL,SOURCEFILE XXXXXX,1,John, [email protected],users1.csv

Какие способы достижения этого есть, которые кто-нибудь может порекомендовать?

1. Я думал о запуске некоторого предварительного процесса для создания имени источника в файле, но в идеале я не хочу менять исходный источник данных.

2 - я думал об обновлении набора данных с именем файла ретроспективно - это кажется хорошим вариантом, но это должно происходить между наборами загрузки (например, после импорта users1.csv и до импорта users2.csv).

Есть ли у кого-нибудь предложения относительно элегантного способа сделать это? Был бы признателен за любой вклад.


person mr_gooding    schedule 05.02.2015    source источник
comment
с какими проблемами вы столкнулись с mongoimport? ты пробовал?   -  person Pogrindis    schedule 05.02.2015
comment
Я сделал mongoimport, не получил никаких ошибок, но не смог увидеть в синтаксисе возможность использовать текущее имя файла в качестве поля...   -  person mr_gooding    schedule 05.02.2015
comment
mongoimport не может добавить имя файла для вас. Вы должны сделать 1, 2 или использовать библиотеку csv и драйвер, чтобы написать задание импорта самостоятельно.   -  person wdberkeley    schedule 05.02.2015


Ответы (1)


Я не уверен, почему вы не можете использовать импорт монго?

mongoimport -d databaseToUse -c Collection --type csv --ignoreBlanks --file users1.csv --headerline

--headerline использует первую строку в качестве имен полей, это должно импортировать файл без проблем.

Вы можете указать поля позже, если хотите, с помощью

--fields <field1[,field2]>, -f <field1[,field2] etc etc>

Я проверил это и не имел никаких проблем ..

Что касается добавления к нему, вы можете использовать функцию updateOne в сочетании, чтобы добавить имя файла в запись.

var bulk = dataBaseToUse.items.initializeUnorderedBulkOp();
bulk.find({name:someField}).update( { $set: { sourceFile: fileName } } );

Может что-то в этом духе?

Из первоначального импорта вы можете добавить детали за один раз, используя параметр -f для полей.

Что-то вроде этого создаст поле

mongoimport -d databaseToUse -c Collection --type csv --ignoreBlanks --file users1.csv -f "id, userID, name, email, sourceFile" 

оттуда вам нужно будет обновить всю коллекцию еще в 1 лайнере.

Импорт - это просто... и только инструмент импорта. Не импорт и редактирование на лету.

Функция обновления будет выглядеть примерно так:

dataBaseToUse.Collection.update(
  {
     $set: { sourceFile: "users1.csv" }
  })

мне нужно будет проверить эти 100%, чтобы убедиться, но это может работать! :)

person Pogrindis    schedule 05.02.2015
comment
Мне удалось импортировать данные без каких-либо проблем, но я не мог придумать способ автоматизации процесса для пакета файлов, а также добавить дополнительное поле имени файла — будет выполнять --fields ‹sourceFile['users1.csv'] разрешить мне добавлять дополнительные поля в заголовок? - person mr_gooding; 05.02.2015
comment
@mr_gooding Я обновил ответ, теперь, кажется, я вижу 2 шага. Доступен $setOnInsert, но я не могу применить его к методу mongoimport! :( - person Pogrindis; 05.02.2015
comment
Спасибо, это звучит как способ сделать это - тогда я мог бы вызвать скрипт-оболочку, который вызывал mongoimport, а затем mongo.exe со второй командой обновления, чтобы установить исходный файл. ценю вашу помощь в этом - дам вам знать, когда у меня будет возможность попробовать это завтра. - person mr_gooding; 05.02.2015
comment
можно ли добавить пару ключ: значение в качестве дополнительного поля, которого нет в файле импорта? - person shabinjo; 19.03.2018