В частности, я хочу напечатать результаты файла mongodb find()
в файле. Объект JSON слишком велик, поэтому я не могу просмотреть весь объект с размером окна оболочки.
Есть ли способ "довольно" распечатать вывод оболочки MongoDB в файл?
Ответ 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