Чи є спосіб "гарненько" надрукувати висновок оболонки MongoDB у файл?


101

Зокрема, я хочу надрукувати результати mongodb find()у файл. Об'єкт JSON занадто великий, тому я не можу переглянути весь об'єкт з розміром вікна оболонки.

Відповіді:


216

Оболонка забезпечує деякі приємні, але приховані функції, оскільки це інтерактивне середовище.

Якщо ви запускаєте команди з файлу javascript через mongo commandnds.js, ви не отримаєте абсолютно однакової поведінки.

Існує два шляхи навколо цього.

(1) підробляють оболонку і дають їй думати, що ти перебуваєш в інтерактивному режимі

$ mongo dbname << EOF > output.json
db.collection.find().pretty()
EOF

або
(2) використовувати Javascript для перекладу результату find()в JSON для друку

mongo dbname command.js > output.json

де command.js містить це (або його еквівалент):

printjson( db.collection.find().toArray() )

Це дозволить надрукувати масив результатів, у тому числі [ ]- якщо ви не хочете, ви можете перебирати масив і printjson()кожен елемент.

До речі, якщо ви працюєте лише з одним твердженням Javascript, вам не потрібно вводити його у файл і замість цього ви можете використовувати:

$ mongo --quiet dbname --eval 'printjson(db.collection.find().toArray())' > output.json

command.js має бути читабельним файлом, який існує у вашому поточному каталозі та має javascript, який ви хочете запустити.
— Ася Камський

Як це зробити для віддаленого монго db? Я спробував, mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtале це дало мені JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
— Шехаряр

ця помилка означає, що всередині ваших цитат після --eval не є юридичним синтаксисом. Я рекомендую використовувати одинарні лапки поза цілими виразами, і якщо у вас є потреба в цитатах, використовуйте для цього подвійні лапки.
— Ася Камський

2
Варіант 2 насправді є єдиним варіантом, якщо у вас є більш ніж декілька результатів, оскільки у варіанті 1 він просто зупиниться на "Введіть" його "для більше".
— Томті

2
насправді не @Tomty - розмір партії оболонки керується змінною всередині оболонки. ви можете помістити DBQuery.shellBatchSize = 10000 у свій .mongodbrc.js файл, і він "зупиниться" після 10000 результатів замість 20.
— Ася Камський

29

Оскільки ви робите це на терміналі і просто хочете перевірити запис на розумний спосіб, ви можете використовувати такий трюк:

mongo | tee somefile

Використовуйте сеанс як звичайно - db.collection.find().pretty()або все, що вам потрібно зробити, ігноруйте довгий вихід і вийдіть. Стенограма вашого сеансу міститиметься у файлі, teeдо якого написано.

Майте на увазі, що вихід може містити послідовності втечі та інше сміття через оболонку монго, яка очікує інтерактивного сеансу. lessсправляється з ними витончено.


12

Просто покладіть команди, які ви хочете запустити у файл, а потім передайте його в оболонку разом з іменем бази даних і перенаправляйте вихід на файл. Отже, якщо ваша команда find є, find.jsа ваша база даних foo, це виглядатиме так:

./mongo foo find.js >> out.json

Це не спрацювало для мене, лише роздрукована версія оболонки та ім'я db для out.json. mongo foo < find.js > out.jsonзробили роботу.
— Джеймс Браун

1
ця відповідь була написана ще до того, як інструменти були переписані на Go та багато версій тому, якщо ви не використовуєте щось дуже старе, то, мабуть, це не працює для вас
— Адам Комерфорд,

10

Скажімо, ваш запит (наприклад db.someCollection.find().pretty()) у файл javascript query.js. Потім запустіть його в оболонці операційної системи за допомогою команди:

mongo yourDb < query.js > outputFile

Результат запиту буде у файлі під назвою 'outputFile'.

За замовчуванням Монго роздруковує перші 20 документів IIRC. Якщо ви хочете більше, ви можете визначити нове значення для розміру партії в оболонці Mongo, наприклад

DBQuery.shellBatchSize = 100.


Це. Не перекладайте неправильно через .jsрозширення. Ви можете написати всі ці приємні запити оболонок монго, не змінюючи їх зовсім.
— AD

4

Використання printі JSON.stringifyви можете просто зробити правильний JSON результат.
Використовуйте --quietпрапор, щоб фільтрувати шум оболонки з виводу.
Використовуйте --norcпрапор, щоб уникнути .mongorc.jsоцінки. (Я повинен був зробити це з - за досить-форматіровщіком , що я використовую, який виробляє неприпустимий формат JSON вихід) Використання DBQuery.shellBatchSize = ?заміни ?з межею фактичного результату , щоб уникнути підкачки.

І, нарешті, використовуйте teeдля передачі термінальний вихід у файл:

// Shell:
mongo --quiet --norc ./query.js | tee ~/my_output.json

// query.js:
DBQuery.shellBatchSize = 2000;
function toPrint(data) {
  print(JSON.stringify(data, null, 2));
}

toPrint(
  db.getCollection('myCollection').find().toArray()
);

Сподіваюся, це допомагає!


2

Користуючись цією відповіддю від Асі Камської, я написав однолінійний сценарій bat для Windows. Рядок виглядає приблизно так:

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

Тоді можна запустити його:

exportToJson.bat DbName CollectionName


2

Мені вдалося зберегти результат за допомогою функції writeFile () .

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Версія оболонки Монго становила 4.0.9


1

Для цього також є mongoexport , але я не впевнений, з якої версії він доступний.

Приклад:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

0

Як відповідь Neodan mongoexport є досить корисним з -qваріантом запиту. Він також конвертує ObjectIdв стандартний формат JSON "$oid". Наприклад:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

0

Ви можете використовувати цю команду для її отримання:

mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.