Jak wydrukować ponad 20 pozycji (dokumentów) w powłoce MongoDB?

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

nie zrobię tego. Nadal drukuje tylko 20 dokumentów.

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

wydrukuje bardzo rozszerzony widok każdego dokumentu zamiast wersji 1-wierszowej dla find():

niepolarność
źródło
Domyślnie powłoka mongo drukuje tylko pierwsze 20 dokumentów, a następne 20 partii można uzyskać, wpisując Type itpowłokę. I tak dalej.
roottraveller

Odpowiedzi:

381

DBQuery.shellBatchSize = 300

zrobi.

Dokumenty MongoDB - Skonfiguruj powłokę mongo - Zmień rozmiar partii powłoki mongo

Thilo
źródło
1
Czy istnieje sposób, aby uczynić to trwałym?
Łukasz Wiktor
7
@L ŁukaszWiktor tak, możesz utworzyć plik $ HOME / .mongorc.js i umieścić tam ustawienie shellBatchSize. mine ma ustawienie wielkości partii zapytania i włączoną funkcję rs.slaveOk (). jego użycie jest również nieco inne w przypadku korzystania z --eval poprzez wiersz poleceń. patrz: docs.mongodb.com/manual/mongo/#mongorc-js-file
matias elgart
1
To wspaniale! Dzięki @matiaselgart
Łukasz Wiktor
link jest nieaktualny, nie zawiera takich informacji. Czy mogę również przekazać to jako zmienną środowiskową?
phil294,
157

Z powłoki, jeśli chcesz pokazać wszystkie wyniki, które możesz zrobić, db.collection.find().toArray()aby uzyskać wszystkie wyniki bez niego.

Sridhar
źródło
To. Jeśli chcesz je wszystkie w skorupce, aby móc je wycinać i wklejać, wystarczy.
superluminarny
Ten jest bardziej przydatny
anwerj
To właśnie to dla mnie zrobiło. Prawdę mówiąc, właśnie potrzebowałem sposobu, aby zapisać wszystkie wyniki z produkcji Robomongo. Dziękuję Ci!
Andrés Botero,
To świetnie, a także pozwoliło mi przesłać wynik do jq :)
Omer van Kloeten
Idealne rozwiązanie! Człowieku, to jest bardzo przydatne.
coderpc
93

Możesz użyć itwewnątrz powłoki, aby iterować kolejne 20 wyników. Po prostu wpisz, itjeśli zobaczysz „ma więcej”, a zobaczysz kolejne 20 pozycji.

halfdan
źródło
35
och, tak naprawdę chodzi o to, jak wydrukować wszystko bez użyciait
nonpolarity
15
Dzięki, halfdan, jesteś dwa razy pod Twoją nazwą użytkownika!
cassi.lup
6
Całą ideą NIE jest używanie iteratora
Amir Kost
2
Odrzuciłem głos, ponieważ tego właśnie OP chciał uniknąć (co jest domyślnym zachowaniem).
crafter
41

Zawsze można zrobić:

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

Aby uzyskać ten kompaktowy widok.

Uważam również za bardzo przydatne ograniczenie pól zwracanych przez znalezisko, więc:

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

który zwróciłby tylko foo z pola _id i name.

Wilfred Knievel
źródło
1
Podoba mi się ten sposób, ponieważ może być uruchomiony w skrypcie powłoki (klient mongo z --eval)
Zheng Kai,
1
@ZhengKai, jeśli używasz skryptu, a nie w powłoce, to shellBatchSize nie ma znaczenia, ponieważ twoje wyniki nie będą powtarzane przez powłokę, będziesz musiał to zrobić sam.
Asya Kamsky,
Tojson () było dokładnie tym, czego szukałem do konwersji z DBQuery dziękuję!
Mark Pieszak - Trilon.io
4

Sugeruję, abyś miał ~/.mongorc.jsplik, więc nie musisz za każdym razem ustawiać domyślnego rozmiaru.

 # 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

Aby dowiedzieć się więcej o tym, co jeszcze możesz zrobić, proponuję zajrzeć do tego artykułu: http://mo.github.io/2017/01/22/mongo-db-tips-and-tricks.html

Sahith Vibudhi
źródło
0

W powłoce mangowej, jeśli zwrócony kursor nie jest przypisany do zmiennej za pomocą słowa kluczowego var, kursor jest automatycznie iterowany w celu uzyskania dostępu do pierwszych 20 dokumentów pasujących do zapytania. Możesz ustawić zmienną DBQuery.shellBatchSize, aby zmienić liczbę automatycznie iterowanych dokumentów.

Odniesienie - https://docs.mongodb.com/v3.2/reference/method/db.collection.find/

Harsh Raj
źródło