В частности, я хочу распечатать результаты 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
.
Поскольку вы делаете это на терминале и просто хотите проверить запись разумным способом, вы можете использовать такой трюк:
mongo | tee somefile
Используйте сеанс как обычно - db.collection.find().pretty()
или все, что вам нужно, игнорируйте длинный вывод и выйдите. Стенограмма вашего сеанса будет в файле, в который вы tee
писали.
Помните, что вывод может содержать escape-последовательности и другой мусор из-за того, что оболочка mongo ожидает интерактивного сеанса. less
обрабатывает их изящно.
Просто поместите команды, которые вы хотите запустить, в файл, затем передайте их оболочке вместе с именем базы данных и перенаправьте вывод в файл. Итак, если ваша команда find find.js
и ваша база данных есть foo
, это будет выглядеть так:
./mongo foo find.js >> out.json
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
для передачи вывода терминала в файл:
// 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()
);
Надеюсь это поможет!
Используя этот ответ Аси Камской, я написал однострочный скрипт летучей мыши для Windows. Строка выглядит так:
mongo --quiet %1 --eval "printjson(db.%2.find().toArray())" > output.json
Тогда его можно запустить:
exportToJson.bat DbName CollectionName
Также есть монгоэкспорт , но я не уверен, с какой версии он доступен.
Пример:
mongoexport -d dbname -c collection --jsonArray --pretty --quiet --out output.json
вы можете использовать эту команду, чтобы добиться этого:
mongo admin -u <userName> -p <password> --quiet --eval "cursor = rs.status(); printjson(cursor)" > output.json