Есть ли способ «красиво» распечатать вывод оболочки 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.

JohnP
источник
Это. Не позволяйте .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

Pavel_H
источник
1

Также есть монгоэкспорт , но я не уверен, с какой версии он доступен.

Пример:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
Неодан
источник
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

Паримал Яна
источник