Как экспортировать JSON из MongoDB с помощью Robomongo


109

Так что я мало о чем знаю MongoDB. Я RoboMongoиспользую, который я подключаюсь к MongoDB. Что мне нужно сделать, так это то, что в этом MongoDB есть коллекция. Я хочу экспортировать данные из этой коллекции, чтобы сохранить их в файл.

Я использовал интерфейс, чтобы открыть данные из коллекции в виде текста, сделал Ctrl+ Aи вставил в текстовый файл. Однако я обнаружил, что не все данные копируются, а также что в текстовых данных было много комментариев, которые, естественно, нарушают JSON.

Мне интересно, есть ли у RoboMongo Export As JSONсредство, позволяющее мне выполнять чистый экспорт.

Любые указатели приветствуются!


Вы хотите экспортировать отдельные коллекции или полную базу данных?
Рамеш Муругесан

1
Это не текущая функция Robomongo, но я добавил предложение функции в очередь задач github: Добавить экспорт JSON . Есть общее предложение, что импорт / экспорт должен быть интегрирован , но были бы полезны более подробные / практические примеры использования. Например, должно ли это поддерживать экспорт JSON из коллекции, поискового запроса или конвейера агрегации? В настоящее время лучшим вариантом является использование стандартного mongoexportинструмента командной строки.
Stennie

1
@Stennie - спасибо за комментарий. Я полагаю, что отвечу на ваш вопрос - с точки зрения клиентского опыта, это не имеет особого значения. В большинстве других интерфейсов БД вы выполняете запрос (с критериями или без них) и получаете набор результатов. Щелкните правой кнопкой мыши и скажите «экспортировать результаты как ...». То же самое должно быть применимо и здесь. Не имеет значения, экспортирую ли я всю коллекцию или поисковый запрос. Если результат можно отобразить на панели, его следует экспортировать.
Неопределенная переменная

1
Просто вы можете это сделатьmongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Нарен

Ответы:


64

Вы можете использовать tojsonдля преобразования каждой записи в JSON в сценарии оболочки MongoDB .

Запустите этот скрипт в RoboMongo:

var cursor = db.getCollection('foo').find({}, {});
while(cursor.hasNext()) {
    print(tojson(cursor.next()))
}

Это печатает все результаты в виде массива, подобного JSON.

Результат не совсем JSON! Некоторые типы, такие как даты и идентификаторы объектов, печатаются как вызовы функций JavaScript, например ISODate("2016-03-03T12:15:49.996Z").

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


3
Он выводит недопустимый json. Просто json-сериализованные записи одну за другой
ruX

Во многих случаях можно использовать tojson(db.getCollection(...).find(...)["_batch"])для вывода всего текущего пакета, полученного с сервера.
Yuval

@Yuval То есть буквально ["_batch"]? Вы можете привести пример, как это использовать? Я пробовал это с Robo 3T 1.2.1, но там написано только «Скрипт выполнен успешно, но результатов нет».
Флориан Винтер,

7
@FlorianWinter Это было всего лишь на основе случайных выводов, полученных в результате возни. Лучшее решение tojson(db.getCollection(...).find(...).toArray()).
Yuval

@Yuval Красиво! Тогда это самое простое решение, намного лучше моего. Вы можете опубликовать это как ответ. (Или отредактируйте мой, но тогда я получу всю заслугу, которую вы заслуживаете, что было бы несколько несправедливо ...)
Флориан Винтер,

60

Быстрый и грязный способ: просто напишите свой запрос как db.getCollection('collection').find({}).toArray()и щелкните правой кнопкой мыши Copy JSON. Вставьте данные в любой редактор.

введите описание изображения здесь


4
Аккуратно! Совсем не грязно, учитывая отсутствие функции экспорта в robo3t. Намного проще для небольших наборов данных по сравнению с другими предлагаемыми решениями.
Илья Лузянин

30

Функциональность оболочки Robomongo решит проблему. В моем случае мне понадобилась пара столбцов в формате CSV.

var cursor = db.getCollection('Member_details').find({Category: 'CUST'},{CustomerId :1,Name :1,_id:0})

while (cursor.hasNext()) {
    var record = cursor.next();   
    print(record.CustomerID + "," + record.Name)
}

Output : -------

334, Harison
433, Rechard
453, Michel
533, Pal

1
Можно ли записать вывод этого скрипта в csv локально в оболочке Robomongo?
xxxvincxxx

Это дает мне «Сценарий успешно выполнен, но нет результатов для отображения»
Шаника Эдиривира

Ошибка: Строка 10: Неверная левая сторона в назначении
Евгений Суник

19

Есть несколько графических интерфейсов MongoDB, некоторые из них имеют встроенную поддержку экспорта данных. Вы найдете полный список графических интерфейсов MongoDB на http://mongodb-tools.com

Вы спросили об экспорте результатов вашего запроса, а не об экспорте целых коллекций. Дайте 3T MongoChef MongoDB Gui попробовать этот инструмент имеет поддержку для вашего конкретного случая использования.


Studio 3T выполнила работу проще, чем ожидалось! : +1:
vinyll

16

вы говорите «экспорт в файл» как в электронной таблице? как в .csv?

ИМО, это САМЫЙ ПРОСТОЙ способ сделать это в Robo 3T (ранее robomongo):

  1. В правом верхнем углу графического интерфейса Robo 3T есть кнопка «Просмотреть результаты в текстовом режиме», нажмите ее и скопируйте все.

  2. вставьте все на этот сайт: https://json-csv.com/

  3. нажмите кнопку загрузки, и теперь у вас есть электронная таблица.

надеюсь, это поможет кому-то, так как я бы хотел, чтобы у Robo 3T были возможности экспорта


11

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

mongoexport --db (Database name) --collection (Collection Name) --out (File name).json

Меня устраивает.


8

Не думаю, что у робомонго есть такая функция. Так что вам лучше использовать функцию mongodb как mongoexport для конкретной коллекции.

http://docs.mongodb.org/manual/reference/program/mongoexport/#export-in-json-format

Но если вы ищете решение для резервного копирования, лучше использовать

mongodump / mongorestore

5

Расширяя ответ Аниша, я хотел что-то, что я мог бы применить к любому запросу, чтобы автоматически выводить все поля, а не определять их в инструкции печати. Возможно, это можно упростить, но это было что-то быстрое и грязное, что отлично работает:

var cursor = db.getCollection('foo').find({}, {bar: 1, baz: 1, created_at: 1, updated_at: 1}).sort({created_at: -1, updated_at: -1});

while (cursor.hasNext()) {
    var record = cursor.next();
    var output = "";
    for (var i in record) {
      output += record[i] + ",";
    };
    output = output.substring(0, output.length - 1);
    print(output);
}

4

Если вы хотите использовать mongoimport , вам нужно экспортировать следующим образом:

db.getCollection('tables')
  .find({_id: 'q3hrnnoKu2mnCL7kE'})
  .forEach(function(x){printjsononeline(x)});

2

Используя сценарий оболочки robomongo:

//on the same db
var cursor = db.collectionname.find();

while (cursor.hasNext()) {
    var record = cursor.next();   
    db.new_collectionname.save(record);
}

Использование команды экспорта и импорта mongodb

Вы можете добавить --jsonArrayпараметр / флаг к своей mongoexportкоманде, это экспортирует результат в виде одного массива json.

Затем просто укажите --jsonArrayфлаг снова при импорте.

Или удалите начальные и конечные скобки массива [] в файле, тогда ваш измененный и экспортированный файл будет импортирован с помощью mongoimportкоманды без --jsonArrayфлага.

Подробнее об экспорте здесь: https://docs.mongodb.org/manual/reference/program/mongoexport/#cmdoption--jsonArray

Импортируйте сюда: https://docs.mongodb.org/manual/reference/program/mongoimport/#cmdoption--jsonArray


1

У меня была такая же проблема, и запуск сценария в robomongo (Robo 3T 1.1.1) также не позволяет копировать значения, и не было возможности экспорта. Лучший способ добиться этого - использовать mongoexport, если mongodb установлен на вашем локальном компьютере, вы можете использовать mongoexport для подключения к базе данных на любом сервере и извлечения данных.

Чтобы подключиться к данным на удаленном сервере и к выходному файлу csv, запустите следующий mongoexport в командной строке

mongoexport --host HOSTNAME --port PORT --username USERNAME --password "PASSWORD" --collection COLLECTION_NAME --db DATABASE_NAME --out OUTPUTFILE.csv --type=csv --fieldFile fields.txt

fieldFile: помогает извлечь нужные столбцы, например: содержимое fields.txt может быть просто:

Логин пользователя

только для извлечения значений столбца userId

Данные на удаленном сервере, выходной файл json:

mongoexport --host HOST_NAME --port PORT --username USERNAME --password "PASSWORD" --collection COLECTION_NAME --db DATABASE_NAME --out OUTPUT.json

это извлекает все поля в файл json

данные на localhost (mongodb должен работать на localhost)

mongoexport --db DATABASE_NAME --collection COLLECTION --out OUTPUT.json

Ссылка: https://docs.mongodb.com/manual/reference/program/mongoexport/#use


1

Решение:

mongoexport --db test --collection traffic --out traffic.json<br><br>

введите описание изображения здесь

Где:
база данных ->
имя коллекции mock-server -> имя
выходного файла api_defs -> childChoreRequest.json


1

Расширение ответа Флориана Винтера для людей, которые хотят сгенерировать готовый к выполнению запрос.

dropи insertManyзапросить, используя cursor:

{
    // collection name
    var collection_name = 'foo';

    // query
    var cursor = db.getCollection(collection_name).find({});

    // drop collection and insert script
    print('db.' + collection_name + '.drop();');
    print('db.' + collection_name + '.insertMany([');

    // print documents
    while(cursor.hasNext()) {
        print(tojson(cursor.next()));

        if (cursor.hasNext()) // add trailing "," if not last item
            print(',');
    }

    // end script
    print(']);');
}

Его вывод будет таким:

db.foo.drop();
db.foo.insertMany([
{
    "_id" : ObjectId("abc"),
    "name" : "foo"
}
,
{
    "_id" : ObjectId("xyz"),
    "name" : "bar"
}
]);

0
  1. сделай свой поиск
  2. нажмите кнопку просмотра результатов в режиме JSON
  3. скопировать результат в слово
  4. распечатать результат из слова

Когда в моем документе есть даты, он возвращает элементы ISODate, которые не являются допустимым форматом json.
Константино Кронембергер

1
Зачем вам использовать документ Word для хранения экспорта базы данных? И зачем кому-то печатать экспорт базы данных?
maesk

@maesk 🤣🤣🤣🤣
Чарли
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.