Есть ли способ «красиво» распечатать вывод оболочки MongoDB в файл?


102

В частности, я хочу распечатать результаты mongodb find()в файл. Объект JSON слишком велик, поэтому я не могу просмотреть весь объект с размером окна оболочки.

Ответы:


217

Оболочка предоставляет несколько приятных, но скрытых функций, потому что это интерактивная среда.

Когда вы запускаете команды из файла javascript через mongo commands.js, вы не получите идентичного поведения.

Есть два способа обойти это.

(1) подделать оболочку и заставить ее думать, что вы находитесь в интерактивном режиме

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

или
(2) используйте Javascript для перевода результата a 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, который вы хотите запустить.
Ася Камский

Как мне сделать это для удаленного mongo db? Я пытался, mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txtно это дало мне JavaScript execution failed: SyntaxError: Unexpected token ILLEGAL.
Sheharyar 05

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

2
Вариант 2 - действительно единственный вариант, если у вас больше, чем несколько результатов, поскольку в варианте 1 он просто остановится на «Введите« это »для большего».
Tomty 08

2
не совсем @Tomty - размер пакета оболочки можно контролировать с помощью переменной внутри оболочки. вы можете поместить DBQuery.shellBatchSize = 10000 в свой файл .mongodbrc.js, и он «остановится» после 10000 результатов вместо 20.
Ася Камский

30

Поскольку вы делаете это на терминале и просто хотите проверить запись разумным способом, вы можете использовать такой трюк:

mongo | tee somefile

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

Помните, что вывод может содержать escape-последовательности и другой мусор из-за того, что оболочка mongo ожидает интерактивного сеанса. lessобрабатывает их изящно.


13

Просто поместите команды, которые вы хотите запустить, в файл, затем передайте их оболочке вместе с именем базы данных и перенаправьте вывод в файл. Итак, если ваша команда find find.jsи ваша база данных есть foo, это будет выглядеть так:

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

Это не сработало для меня, только распечатал версию оболочки и имя базы данных out.json. mongo foo < find.js > out.jsonдействительно работал.
Джеймс Браун

1
этот ответ был написан до того, как инструменты были переписаны на Go и много версий назад, если вы не используете что-то очень старое, то, вероятно, поэтому это не работает для вас
Адам Комерфорд

11

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

mongo yourDb < query.js > outputFile

Результат запроса будет в файле с именем outputFile.

По умолчанию Mongo распечатывает первые 20 документов IIRC. Если вы хотите большего, вы можете определить новое значение для размера пакета в оболочке Mongo, например

DBQuery.shellBatchSize = 100.


Это. Не позволяйте .jsрасширению вводить вас в заблуждение . Вы можете написать все эти красивые запросы оболочки mongo, вообще не меняя их.
AD

5

Используя 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

Используя этот ответ Аси Камской, я написал однострочный скрипт летучей мыши для 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()))

Версия оболочки Mongo была 4.0.9



0

Как ответил Неодан, 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.