Як експортувати JSON з MongoDB за допомогою Robomongo


108

Тож я мало про що знаю MongoDB. У мене є RoboMongoвикористання, яке я підключаю до MongoDB. Що мені потрібно зробити, так це - в цьому MongoDB є колекція. Я хочу експортувати дані з цієї колекції, щоб я міг зберегти їх у файл.

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

Мені цікаво, чи є у RoboMongo Export As JSONоб'єкт, щоб я міг зробити чистий експорт.

Будь-які вказівки цінуються!


Ви хочете експортувати певні колекції або повний db?
Рамеш Муругесан

1
Це не поточна особливість Robomongo, але я додав пропозицію щодо функції у черзі випуску github: Додати експорт JSON . Є загальна думка про те, що імпорт / експорт має бути інтегрований , але більш детальні / практичні випадки використання будуть корисними. Наприклад, чи повинна ця підтримка експортувати JSON з колекції, запиту пошуку, конвеєрного конвеєра? Наразі найкращим варіантом є використання стандартного mongoexportінструменту командного рядка.
Стенні

1
@Stennie - дякую за ваш коментар. Гадаю, у відповідь на ваше запитання - з точки зору досвіду клієнтів, це насправді не має значення. У більшості інших інтерфейсів БД потік полягає в тому, що ви запускаєте запит (з критерами або без них), отримуєте набір результатів. Клацніть правою кнопкою миші та скажіть "Експорт результатів як ..." Тож те саме слід застосувати і тут. Не має значення, чи я експортую цілу колекцію чи запит на пошук. Якщо результат може відображатися на панелі, він повинен бути експортованим.
Невизначена змінна

1
Просто ви можете це зробитиmongoexport --uri='mongodb://someUser@mongodb0.example.com:27017/marketing' --collection=contacts --out=contacts.json
Нарен

Відповіді:


63

Ви можете використовувати 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 Ви маєте на увазі буквально ["_batch"]? Чи можете ви навести приклад, як це використовувати? Я спробував це з Robo 3T 1.2.1, але він говорить лише "Сценарій виконаний успішно, але результатів немає для показу".
Флоріан Зима

7
@FlorianWinter Це було якраз із випадкових знахідок, що облягають. Краще рішення tojson(db.getCollection(...).find(...).toArray()).
Ювал

@Yuval Приємно! Тоді найпростіше рішення, набагато краще, ніж моє. Розгляньте публікацію як відповідь. (Або відредагуйте шахту, але тоді я отримаю всю заслугу, яку ви заслуговуєте, що було б дещо несправедливо ...)
Флоріан Зима,

58

Швидкий і брудний спосіб: просто напишіть запит як 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

Це дає мені "Сценарій виконаний успішно, але результатів для показу немає"
Shanika Ediriweera

Помилка: рядок 10: Недійсний лівий бік у присвоєнні
Eugen Sunic

19

Існує кілька графічних інтерфейсів MongoDB, деякі з них мають вбудовану підтримку для експорту даних. Ви знайдете повний список графічних інтерфейсів MongoDB за адресою веб- http://mongodb-tools.com

Ви запитували про експорт результатів свого запиту, а не про експорт цілих колекцій. Спробуйте 3T MongoChef MongoDB GUI спробувати, цей інструмент підтримує ваш конкретний випадок використання.


Студія 3T повністю виконала цю роботу простіше, ніж очікувалося! : +1:
vinyll

16

ви кажете "експорт у файл", як у електронній таблиці? подобається .csv?

IMO, це найпростіший спосіб зробити це в Robo 3T (раніше робомонго):

  1. У верхньому правому куті графічного інтерфейсу Robo 3T є кнопка "Переглянути результати в текстовому режимі", натисніть на неї і скопіюйте все

  2. вставити все на цей веб-сайт: https://json-csv.com/

  3. натисніть кнопку для завантаження, і тепер у вас є електронна таблиця.

сподіваюся, що це допомагає комусь, як я б хотів, щоб Robo 3T мав можливості експорту


Дуже просто, дякую
Tính Ngô Quang

11

Не запускайте цю команду в оболонці, введіть цей скрипт у командному рядку з вашою базою даних, ім'ям колекції та ім'ям файлу, все замінюючи заповнювачі.

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

Це працює для мене.



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: допомагає витягти потрібні стовпці, напр .: вміст field.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-сервера -> ім'я
вихідного файлу 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 🤣🤣🤣🤣
Charlie Schliesser
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.