Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Когда вы запускаете команды из файла javascript через mongo commands.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

Ответ 2

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

mongo | tee somefile

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

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

Ответ 3

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

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

Ответ 4

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

mongo yourDb < query.js > outputFile

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

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

DBQuery.shellBatchSize = 100.

Ответ 5

Используя print и JSON.stringify, вы можете просто создать результат valid 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()
);

Надеюсь, это поможет!

Ответ 6

Используя этот ответ от Asya Kamsky, я написал однострочный bat script для Windows. Строка выглядит так:

mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json

Затем можно запустить его:

exportToJson.bat DbName CollectionName

Ответ 7

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

Пример:

mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json

Ответ 8

Как ответ Neodan, mongoexport весьма полезен с -q для запроса. Он также конвертирует ObjectId в стандартный формат JSON "$oid". Например:

mongoexport -d yourdb -c yourcol --jsonArray --pretty -q '{"field": "filter value"}' -o output.json

Ответ 9

Мне удалось сохранить результат с функцией writeFile().

> writeFile("/home/pahan/output.txt", tojson(db.myCollection.find().toArray()))

Монго версия оболочки была 4.0.9