В частности, я хочу распечатать результаты mongodb find()
в файл. Объект JSON слишком велик, поэтому я не могу просмотреть весь объект с размером окна оболочки.
источник
В частности, я хочу распечатать результаты mongodb find()
в файл. Объект JSON слишком велик, поэтому я не могу просмотреть весь объект с размером окна оболочки.
Оболочка предоставляет несколько приятных, но скрытых функций, потому что это интерактивная среда.
Когда вы запускаете команды из файла 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
mongo blah.mongolab.com:33478/blah -u user -p pass --eval "my query" >> dump.txt
но это дало мнеJavaScript execution failed: SyntaxError: Unexpected token ILLEGAL
.Поскольку вы делаете это на терминале и просто хотите проверить запись разумным способом, вы можете использовать такой трюк:
Используйте сеанс как обычно -
db.collection.find().pretty()
или все, что вам нужно, игнорируйте длинный вывод и выйдите. Стенограмма вашего сеанса будет в файле, в который выtee
писали.Помните, что вывод может содержать escape-последовательности и другой мусор из-за того, что оболочка mongo ожидает интерактивного сеанса.
less
обрабатывает их изящно.источник
Просто поместите команды, которые вы хотите запустить, в файл, затем передайте их оболочке вместе с именем базы данных и перенаправьте вывод в файл. Итак, если ваша команда find
find.js
и ваша база данных естьfoo
, это будет выглядеть так:источник
out.json
.mongo foo < find.js > out.json
действительно работал.Поместите ваш запрос (например
db.someCollection.find().pretty()
) в файл javascript, скажемquery.js
. Затем запустите его в оболочке вашей операционной системы с помощью команды:mongo yourDb < query.js > outputFile
Результат запроса будет в файле с именем outputFile.
По умолчанию Mongo распечатывает первые 20 документов IIRC. Если вы хотите большего, вы можете определить новое значение для размера пакета в оболочке Mongo, например
DBQuery.shellBatchSize = 100
.источник
.js
расширению вводить вас в заблуждение . Вы можете написать все эти красивые запросы оболочки mongo, вообще не меняя их.Используя
print
и,JSON.stringify
вы можете просто получить достоверныйJSON
результат.Используйте
--quiet
флаг для фильтрации шума оболочки из вывода.Используйте
--norc
флаг, чтобы избежать.mongorc.js
оценки. (Мне пришлось это сделать из-за того, что я использую красивое средство форматирования, которое выдает недопустимый вывод JSON ) ИспользуйтеDBQuery.shellBatchSize = ?
замену?
пределом фактического результата, чтобы избежать разбиения на страницы.И, наконец, используйте
tee
для передачи вывода терминала в файл:Надеюсь это поможет!
источник
Используя этот ответ Аси Камской, я написал однострочный скрипт летучей мыши для Windows. Строка выглядит так:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Тогда его можно запустить:
exportToJson.bat DbName CollectionName
источник
Мне удалось сохранить результат с помощью функции writeFile () .
Версия оболочки Mongo была 4.0.9
источник
Также есть монгоэкспорт , но я не уверен, с какой версии он доступен.
Пример:
источник
Как ответил Неодан, mongoexport весьма полезен с
-q
опцией для запроса. Он также конвертируетсяObjectId
в стандартный формат JSON"$oid"
. Например:источник
вы можете использовать эту команду, чтобы добиться этого:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json
источник