Чи є спосіб "гарненько" надрукувати висновок оболонки 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.