Відповіді:
Оболонка забезпечує деякі приємні, але приховані функції, оскільки це інтерактивне середовище.
Якщо ви запускаєте команди з файлу 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