Como imprimir mais de 20 itens (documentos) no shell do MongoDB?

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

não vai fazer isso. Ele ainda imprime apenas 20 documentos.

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

ambos imprimirão uma exibição muito expandida de cada documento, em vez da versão de uma linha para find():

falta de polaridade
fonte
Por padrão, o mongo shell imprime apenas os primeiros 20 documentos, você pode obter o próximo lote de 20 documentos digitando Type itno shell. E assim por diante.
roottraveller

Respostas:

381

DBQuery.shellBatchSize = 300

vai fazer.

MongoDB Docs - Configurar o mongo Shell - Alterar o tamanho do lote do mongo Shell

Thilo
fonte
1
Existe uma maneira de tornar isso persistente?
Lukasz Wiktor
7
@LukaszWiktor sim, você pode criar um arquivo $ HOME / .mongorc.js e colocar essa configuração shellBatchSize lá. o meu tem a configuração de tamanho de lote da consulta e rs.slaveOk () ativado. Seu uso também é um pouco diferente ao usar --eval via linha de comando. consulte: docs.mongodb.com/manual/mongo/#mongorc-js-file
matias elgart
1
Isso é ótimo! Obrigado @matiaselgart
Lukasz Wiktor
o link está desatualizado, ele não contém essas informações. Além disso, posso passar isso como uma variável de ambiente?
precisa saber é
157

No shell, se você quiser mostrar todos os resultados, poderá db.collection.find().toArray()obter todos os resultados sem ele.

Sridhar
fonte
Este. Se você quiser apenas todos em uma concha para poder recortar e colar, isso é suficiente.
superluminary
Este é mais útil
anwerj
Isso é exatamente o que fez por mim. Verdade seja dita, eu só precisava de uma maneira de salvar todos os resultados da saída de Robomongo. Obrigado!
Andrés Botero
Isso é ótimo, e também deixe-me tubulação o resultado para jq :)
Omer van Kloeten
Solução perfeita! Cara, isso é muito útil.
Coderpc
93

Você pode usar o itinterior do shell para iterar nos próximos 20 resultados. Basta digitar itse vir "tem mais" e você verá os próximos 20 itens.

halfdan
fonte
35
oh é realmente sobre como imprimir tudo sem usarit
nonopolarity
15
Obrigado halfdan, você é o dobro do seu nome de usuário e diz!
cassi.lup 9/09/13
6
A idéia não é usar o iterador
Amir Kost
2
Fiz uma votação baixa porque era isso que o OP queria evitar (que é o comportamento padrão).
Crafter
41

Sempre poderia fazer:

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

Para obter essa visão compacta.

Além disso, acho muito útil limitar os campos retornados pela localização, portanto:

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

que retornaria apenas o campo _id e name de foo.

Wilfred Knievel
fonte
1
Eu gosto desta maneira becase ele pode ser executado em shell script (cliente mongo com --eval)
Zheng Kai
1
@ZhengKai Se você estiver usando um script e não no shell, o shellBatchSize não é relevante, pois seus resultados não serão iterados pelo shell, você precisará fazer isso sozinho.
Asya Kamsky #
O tojson () era exatamente o que eu estava procurando para convertê-lo do DBQuery, obrigado!
Mark Pieszak # Trilon.io 26/10/2015
4

Eu sugiro que você tenha um ~/.mongorc.jsarquivo para não precisar definir o tamanho padrão todas as vezes.

 # 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

Para saber mais sobre o que mais você pode fazer, sugiro que consulte este artigo: http://mo.github.io/2017/01/22/mongo-db-tips-and-tricks.html

Sahith Vibudhi
fonte
0

No shell mongo, se o cursor retornado não for atribuído a uma variável usando a palavra-chave var, o cursor será iterado automaticamente para acessar os 20 primeiros documentos correspondentes à consulta. Você pode definir a variável DBQuery.shellBatchSize para alterar o número de documentos iterados automaticamente.

Referência - https://docs.mongodb.com/v3.2/reference/method/db.collection.find/

Harsh Raj
fonte