Відповіді:
Оболонка забезпечує деякі приємні, але приховані функції, оскільки це інтерактивне середовище.
Якщо ви запускаєте команди з файлу 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
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
але це дало мені JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.
Оскільки ви робите це на терміналі і просто хочете перевірити запис на розумний спосіб, ви можете використовувати такий трюк:
mongo | tee somefile
Використовуйте сеанс як звичайно - db.collection.find().pretty()
або все, що вам потрібно зробити, ігноруйте довгий вихід і вийдіть. Стенограма вашого сеансу міститиметься у файлі, tee
до якого написано.
Майте на увазі, що вихід може містити послідовності втечі та інше сміття через оболонку монго, яка очікує інтерактивного сеансу. less
справляється з ними витончено.
Просто покладіть команди, які ви хочете запустити у файл, а потім передайте його в оболонку разом з іменем бази даних і перенаправляйте вихід на файл. Отже, якщо ваша команда find є, find.js
а ваша база даних foo
, це виглядатиме так:
./mongo foo find.js >> out.json
out.json
. mongo foo < find.js > out.json
зробили роботу.
Скажімо, ваш запит (наприклад db.someCollection.find().pretty()
) у файл javascript query.js
. Потім запустіть його в оболонці операційної системи за допомогою команди:
mongo yourDb < query.js > outputFile
Результат запиту буде у файлі під назвою 'outputFile'.
За замовчуванням Монго роздруковує перші 20 документів IIRC. Якщо ви хочете більше, ви можете визначити нове значення для розміру партії в оболонці Mongo, наприклад
DBQuery.shellBatchSize = 100
.
.js
розширення. Ви можете написати всі ці приємні запити оболонок монго, не змінюючи їх зовсім.
Використання 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()
);
Сподіваюся, це допомагає!
Користуючись цією відповіддю від Асі Камської, я написав однолінійний сценарій bat для Windows. Рядок виглядає приблизно так:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Тоді можна запустити його:
exportToJson.bat DbName CollectionName
Для цього також є mongoexport , але я не впевнений, з якої версії він доступний.
Приклад:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
Ви можете використовувати цю команду для її отримання:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json