Как распечатать более 20 документов (документов) в оболочке MongoDB?


253
db.foo.find().limit(300)

не буду этого делать Он по-прежнему печатает только 20 документов.

db.foo.find().toArray()
db.foo.find().forEach(printjson)

оба распечатают очень расширенный вид каждого документа вместо 1-строчной версии для find():


По умолчанию в оболочке mongo печатаются только первые 20 документов, вы можете получить следующие 20 документов, набрав Type itв оболочке. И так далее.
roottraveller

Ответы:


381

1
Есть ли способ сделать это постоянным?
Лукаш Виктор

7
@LukaszWiktor да, вы можете создать файл $ HOME / .mongorc.js и поместить туда настройку shellBatchSize. У меня есть настройка размера пакета запроса и включена функция rs.slaveOk (). его использование также немного отличается при использовании --eval через командную строку. см .: docs.mongodb.com/manual/mongo/#mongorc-js-file
Матиас Элгарт

1
Замечательно! Спасибо @matiaselgart
Лукаш Виктор

ссылка устарела, такой информации нет. Кроме того, я могу передать это как переменную среды?
phil294

157

Из оболочки, если вы хотите показать все результаты, вы можете сделать, db.collection.find().toArray()чтобы получить все результаты без него.


Это. Если вы просто хотите, чтобы все они были в оболочке, чтобы вы могли вырезать и вставлять, этого достаточно.
суперсветовой

Этот более полезен
anwerj

Это именно то, что сделал это для меня. По правде говоря, мне просто нужен был способ сохранить все результаты из результатов Robomongo. Спасибо!
Андрес Ботеро

Это здорово, и это также позволило мне передать результат в jq :)
Омер ван Клоэтен

Идеальное решение! Чувак, это очень полезно.
coderpc

93

Вы можете использовать itвнутри оболочки, чтобы перебрать следующие 20 результатов. Просто введите, itесли вы видите «имеет больше», и вы увидите следующие 20 пунктов.


35
о, это действительно о том, как распечатать все без использованияit
неполярность

15
Спасибо, Халфдан, ты в два раза больше, чем твое имя пользователя!
cassi.lup

6
Вся идея НЕ в том, чтобы использовать итератор
Амир Кост

2
Я понизил голосование, потому что это то, чего ОП хотел избежать (это поведение по умолчанию).
Crafter

41

Всегда можно сделать:

db.foo.find().forEach(function(f){print(tojson(f, '', true));});

Чтобы получить этот компактный вид.

Кроме того, я считаю очень полезным ограничить поля, возвращаемые функцией find, так:

db.foo.find({},{name:1}).forEach(function(f){print(tojson(f, '', true));});

который вернул бы только поле _id и name из foo.


1
Мне нравится этот способ, потому что он может работать в сценарии оболочки (клиент Монго с --eval)
Чжэн Кай

1
@ZhengKai, если вы используете скрипт, а не в оболочке, shellBatchSize не имеет значения, поскольку ваши результаты не будут повторяться для вас оболочкой, вам придется делать это самостоятельно.
Ася Камская

Тойсон () был именно тем, что я искал, чтобы преобразовать его из DBQuery, спасибо!
Марк Пешак - Trilon.io

4

Я предлагаю вам иметь ~/.mongorc.jsфайл, чтобы вам не приходилось каждый раз устанавливать размер по умолчанию.

 # execute in your terminal
 touch ~/.mongorc.js
 echo 'DBQuery.shellBatchSize = 100;' > ~/.mongorc.js
 # add one more line to always prettyprint the ouput
 echo 'DBQuery.prototype._prettyShell = true; ' >> ~/.mongorc.js

Чтобы узнать больше о том, что еще вы можете сделать, я предлагаю вам взглянуть на эту статью: http://mo.github.io/2017/01/22/mongo-db-tips-and-tricks.html


0

В оболочке mongo, если возвращенный курсор не назначен переменной с помощью ключевого слова var, курсор автоматически повторяется для доступа к первым 20 документам, которые соответствуют запросу. Вы можете установить переменную DBQuery.shellBatchSize, чтобы изменить количество автоматически повторяющихся документов.

Ссылка - https://docs.mongodb.com/v3.2/reference/method/db.collection.find/

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.