В частности, я хочу распечатать результаты 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