db.collection.find()
MongoDB com drivers
Esta página documenta um método mongosh
. Para ver o método equivalente em um driver MongoDB, consulte a página correspondente da sua linguagem de programação:
Definição
db.collection.find(query, projection, options)
Seleciona documentos em uma coleção ou exibição e retorna um cursor para os documentos selecionados.
Retorna: Um cursor para os documentos que correspondem aos critérios de query
. Quando o métodofind()
"retorna documentos", o método está, na verdade, retornando um cursor para os documentos.
Compatibilidade
Esse método está disponível em implantações hospedadas nos seguintes ambientes:
MongoDB Atlas: o serviço totalmente gerenciado para implantações do MongoDB na nuvem
Importante
Este comando tem suporte limitado em clusters M0, M2 e M5 . Para obter mais informações, consulte Comandos não suportados.
MongoDB Enterprise: a versão autogerenciada e baseada em assinatura do MongoDB
MongoDB Community: uma versão com código disponível, de uso gratuito e autogerenciada do MongoDB
Sintaxe
O método find()
tem o seguinte formato:
db.collection.find( <query>, <projection>, <options> )
O método find()
utiliza os seguintes parâmetros:
Parâmetro | Tipo | Descrição |
---|---|---|
documento | Opcional. Especifica o filtro de seleção utilizando operadores de consulta. Para devolver todos os documentos em uma coleção, omita este parâmetro ou passe um documento vazio ( | |
documento | Opcional. Especifica os campos a serem retornados nos documentos que correspondem ao filtro de consulta. Para retornar todos os campos nos documentos correspondentes, omita este parâmetro. Para obter detalhes, consulte Projeção. | |
documento | Opcional. Especifica mais opções para a query. Estas opções modificam o comportamento da query e a forma como os resultados são retornados. Para ver detalhes, consulte Opções. |
Comportamento
Projeção
Importante
Consistência de linguagem
Para manter a consistência da projeção dos elementos find()
e findAndModify()
com o estágio $project
da agregação,
A projeção
find()
efindAndModify()
pode aceitar expressões de agregação e sintaxe.O MongoDB impõe restrições adicionais em relação às projeções. Consulte Restrições de Projeção para detalhes.
O parâmetro projection
determina quais campos serão retornados nos documentos correspondentes. O parâmetro projection
obtém um documento do seguinte formulário:
{ <field1>: <value>, <field2>: <value> ... }
Projeção | Descrição |
---|---|
<field>: <1 or true> | Especifica a inclusão de um campo. Se você especificar um número inteiro diferente de zero para o valor de projeção, a operação tratará o valor como true . |
<field>: <0 or false> | Especifica a exclusão de um campo. |
"<field>.$": <1 or true> | Usa o operador de projeção de array Não disponível para visualizações. |
<field>: <array projection> | Usa os operadores de projeção de array ( Não disponível para visualizações. |
<field>: <$meta expression> | Usa a expressão do operador Não disponível para visualizações. |
<field>: <aggregation expression> | Especifica o valor do campo projetado. Com o uso de expressões de agregação e sintaxe, incluindo o uso de literais e variáveis de agregação, você pode projetar novos campos ou projetar campos existentes com novos valores.
|
Opções
Opção | Descrição |
---|---|
allowDiskUse | Se pipelines que exigem mais de 100 megabytes de memória para executar a gravação em arquivos temporários no disco. Para ver os detalhes, consulte cursor.allowDiskUse() . |
allowPartialResults | No caso das queries em uma coleção fragmentada, permite que o comando (ou comandos getMore subsequentes) retorne resultados parciais, em vez de um erro, se um ou mais fragmentos analisados não estiverem disponíveis. |
awaitData | Se o cursor for um cursor persistente de espera (tailable-await cursor) Requer que tailable seja true . |
agrupamento | Configurações de agrupamento para operação de atualização. |
comment | Adiciona um $comment à consulta que aparece nos logs do analisador. |
explicar | Adiciona uma saída de explicação com base no modo de verbosidade fornecido. |
dica | Força o otimizador de consultas a usar índices específicos na query. |
limit | Define um limite de documentos retornados no conjunto de resultados. |
max | O limite superior exclusivo para um índice específico. |
maxAwaitTimeMS | O tempo máximo para o servidor aguardar novos documentos para atender a uma query de cursor persistente. Requer que tailable e awaitData sejam true . |
maxTimeMS | O máximo de tempo (em milissegundos) que o servidor deve permitir que a query seja executada. |
min | O limite inferior inclusivo para um índice específico. |
noCursorTimeout | Se o servidor deve ou não atingir o tempo limite do cursor após um período de inatividade (por padrão, 10 minutos). |
readConcern | Especifica o nível de preocupação de leitura para a query. |
readPreference | Especifica o nível de preferência de leitura da query. |
returnKey | Se apenas as chaves do índice são retornadas para uma query. |
showRecordId | Se o campo $recordId for adicionado aos documentos retornados. O $recordId indica a posição do documento no conjunto de resultados. |
ignorar | Quantos documentos devem ser ignorados antes de retornar o primeiro documento no conjunto de resultados. |
sort | A ordem dos documentos retornados no conjunto de resultados. Os campos especificados na classificação devem ter um índice. |
persistente | Indica se o cursor é persistente. Os cursores persistentes permanecem abertos após o esgotamento dos resultados iniciais da query. Cursores persistentes só estão disponíveis nas Capped Collections. |
Especificação de campo incorporada
Para campos em documentos incorporados, você pode especificar o campo usando:
notação de pontos, por exemplo
"field.nestedfield": <value>
formato aninhado, por exemplo
{ field: { nestedfield: <value> } }
_id
Projeção de campo
O campo _id
é incluído nos documentos retornados por padrão, a menos que você especifique explicitamente _id: 0
na projeção para suprimir o campo.
Inclusão ou exclusão
Uma projection
não pode conter especificações de inclusão e exclusão, com exceção do campo _id
:
Em projeções que incluem explicitamente campos, o campo
_id
é o único campo que você pode excluir explicitamente.Em projeções que excluem explicitamente campos, o campo
_id
é o único campo que você pode incluir explicitamente; entretanto, o campo_id
é incluído por padrão.
Consulte Exemplos de projeção.
Manuseio do cursor
A execução de db.collection.find()
em mongosh
itera automaticamente o cursor para exibir até os primeiros 20 documentos. Digite it
para continuar a iteração.
Para acessar os documentos retornados com um driver, use o mecanismo de tratamento de cursor apropriado para a linguagem do driver.
Preocupação de leitura
Para especificar a preocupação de leitura para db.collection.find()
, utilize o método cursor.readConcern()
.
Type Bracketing
O MongoDB trata alguns tipos de dados como equivalentes para fins de comparação. Por exemplo, tipos numéricos passam por conversão antes da comparação. Entretanto, para a maioria dos tipos de dados, operadores de comparação só realizam comparações em documentos em que o tipo BSON do campo de destino corresponde ao tipo do operando de consulta. Considere a seguinte coleção:
{ "_id": "apples", "qty": 5 } { "_id": "bananas", "qty": 7 } { "_id": "oranges", "qty": { "in stock": 8, "ordered": 12 } } { "_id": "avocados", "qty": "fourteen" }
A consulta a seguir usa $gt
para retornar documentos em que o valor de qty
é maior que 4
.
db.collection.find( { qty: { $gt: 4 } } )
A consulta retorna os seguintes documentos:
{ "_id": "apples", "qty": 5 } { "_id": "bananas", "qty": 7 }
O documento com _id
igual a "avocados"
não é retornado porque seu valor qty
é do tipo string
, enquanto o operando $gt
é do tipo integer
.
O documento com _id
igual a "oranges"
não é retornado porque seu valor de qty
é do tipo object
.
Observação
Para impor tipos de dados em uma coleção, use Validação de esquema.
Sessões
Para cursores criados dentro de uma sessão, você não pode chamar getMore
fora da sessão.
Da mesma forma, para cursores criados fora de uma sessão, você não pode chamar getMore
dentro de uma sessão.
Tempo-limite de inatividade da sessão
Os drivers MongoDB e mongosh
associam todas as operações a uma sessão do servidor, com exceção das operações de gravação não reconhecidas. No caso das operações não associadas explicitamente a uma sessão (ou seja, usando Mongo.startSession()
), os drivers MongoDB e mongosh
criam uma sessão implícita e a associam à operação.
Se uma sessão estiver ociosa por mais de 30 minutos, o servidor MongoDB marcará essa sessão como expirada e poderá fechá-la a qualquer momento. Quando o servidor MongoDB fecha a sessão, ele também elimina todas as operações em andamento e abre os cursores associados à sessão. Isso inclui cursores configurados com noCursorTimeout()
ou maxTimeMS()
com mais de 30 minutos.
Para operações que podem estar ociosas por mais de 30 minutos, associe a operação com uma sessão explícita utilizando Mongo.startSession()
e atualize periodicamente a sessão utilizando o comando refreshSessions
. Consulte Tempo limite de inatividade da sessão para obter mais informações.
Transações
db.collection.find()
pode ser usado dentro de transações distribuídas.
Para cursores criados fora de uma transação, você não pode chamar
getMore
dentro da transação.Para cursores criados em uma transação, não é possível chamar
getMore
fora da transação.
Importante
Na maioria dos casos, uma transação distribuída incorre em um custo de desempenho maior do que as gravações de um único documento, e a disponibilidade de transações distribuídas não deve substituir o design eficaz do esquema. Em muitos cenários, o modelo de dados desnormalizado (documentos e arrays incorporados) continuará a ser ideal para seus dados e casos de uso. Ou seja, para muitos cenários, modelar seus dados adequadamente minimizará a necessidade de transações distribuídas.
Para considerações adicionais sobre o uso de transações (como limite de tempo de execução e limite de tamanho do oplog), consulte também Considerações de produção.
Desconexão do cliente
A partir do MongoDB 4.2, se o cliente que emitiu db.collection.find()
se desconectar antes da conclusão da operação, o MongoDB marcará db.collection.find()
para encerramento usando killOp
.
Configurações de query
Novidades na versão 8.0.
Você pode usar as configurações de query para definir dicas de índice, definir filtros de descarte de operação e outros campos. As configurações se aplicam à forma de query em todo o cluster. O cluster mantém as configurações após o fechamento.
O otimizador de query usa as configurações da query como uma entrada adicional durante o planejamento da query, o que afeta o plano selecionado para executar a query. Você também pode usar as configurações de query para bloquear uma forma de query.
Para adicionar configurações de query e explorar exemplos, consulte setQuerySettings
.
Você pode adicionar configurações de consulta para os comandos find
, distinct
e aggregate
.
As configurações de consulta têm mais funcionalidade e são preferidas em relação aos filtros de índice obsoletos.
Para remover as configurações de query, use removeQuerySettings
. Para obter as configurações de consulta, use um estágio $querySettings
em um pipeline de agregação .
Exemplos
Os exemplos nesta seção usam documentos da coleção bios onde os documentos geralmente têm a forma:
{ "_id" : <value>, "name" : { "first" : <string>, "last" : <string> }, // embedded document "birth" : <ISODate>, "death" : <ISODate>, "contribs" : [ <string>, ... ], // Array of Strings "awards" : [ { "award" : <string>, year: <number>, by: <string> } // Array of embedded documents ... ] }
Para criar e preencher a coleção bios
, consulte coleção bios.
Encontre todos os documentos em uma coleção
O método find()
sem parâmetros retorna todos os documentos de uma coleção e retorna todos os campos para os documentos. Por exemplo, a operação a seguir retorna todos os documentos da coleção bios:
db.bios.find()
Encontre documentos que correspondam aos critérios de consulta
Consulta por igualdade
A seguinte operação retorna documentos na coleção bios onde
_id
é igual a5
:db.bios.find( { _id: 5 } ) A operação a seguir retorna documentos na coleção bios em que o campo
last
no documento incorporadoname
é igual a"Hopper"
:db.bios.find( { "name.last": "Hopper" } ) Observação
Para acessar campos em um documento incorporado, use notação de ponto (
"<embedded document>.<field>"
).
Consulta usando operadores
Para localizar documentos que correspondam a um conjunto de critérios de seleção, chame find()
com o parâmetro <criteria>
.
O MongoDB fornece vários operadores de consulta para especificar os critérios.
A operação a seguir usa o operador
$in
para retornar documentos na coleção bios em que_id
é igual a5
ouObjectId("507c35dd8fada716c89d0013")
:db.bios.find( { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } } ) A operação a seguir usa o operador
$gt
retorna todos os documentos da coleçãobios
ondebirth
é maior quenew Date('1950-01-01')
:db.bios.find( { birth: { $gt: new Date('1950-01-01') } } ) A operação a seguir usa o operador
$regex
para retornar documentos na coleção bios em que o camponame.last
começa com a letraN
(ou é"LIKE N%"
)db.bios.find( { "name.last": { $regex: /^N/ } } )
Para obter uma lista dos operadores de consulta, consulte Seletores de consulta.
Consulta para intervalos
Combine operadores de comparação para especificar intervalos para um campo. A operação a seguir retorna dos documentos da coleção bios em que birth
está entre new Date('1940-01-01')
e new Date('1960-01-01')
(exclusivo):
db.bios.find( { birth: { $gt: new Date('1940-01-01'), $lt: new Date('1960-01-01') } } )
Para obter uma lista dos operadores de consulta, consulte Seletores de consulta.
Consulta para múltiplas condições
A seguinte operação retorna todos os documentos da coleção bios onde o campo birth
é greater than
new Date('1950-01-01')
e o campo death
não existe:
db.bios.find( { birth: { $gt: new Date('1920-01-01') }, death: { $exists: false } } )
Para obter uma lista dos operadores de consulta, consulte Seletores de consulta.
Comparar dois campos de um único documento
$expr
pode conter expressões que comparam campos do mesmo documento.
Crie uma coleção monthlyBudget
com estes documentos:
db.monthlyBudget.insertMany( [ { _id : 1, category : "food", budget : 400, spent : 450 }, { _id : 2, category : "drinks", budget : 100, spent : 150 }, { _id : 3, category : "clothes", budget : 100, spent : 50 }, { _id : 4, category : "misc", budget : 500, spent : 300 }, { _id : 5, category : "travel", budget : 200, spent : 650 } ] )
A operação a seguir usa $expr
para localizar documentos em que o valor spent
excede budget
:
db.monthlyBudget.find( { $expr: { $gt: [ "$spent" , "$budget" ] } } )
Saída:
{ _id : 1, category : "food", budget : 400, spent : 450 } { _id : 2, category : "drinks", budget : 100, spent : 150 } { _id : 5, category : "travel", budget : 200, spent : 650 }
Fazer consulta de documentos incorporados
Os exemplos a seguir consultam o campo integrado name
na coleção bios.
Correspondências exatas de consulta em documentos incorporados
A operação a seguir retorna documentos na coleção bios em que o documento incorporado name
é exatamente { first: "Yukihiro", last: "Matsumoto" }
, incluindo a ordem:
db.bios.find( { name: { first: "Yukihiro", last: "Matsumoto" } } )
O campo name
deve corresponder exatamente ao documento incorporado. A consulta não corresponde aos documentos com os seguintes name
campos:
{ first: "Yukihiro", aka: "Matz", last: "Matsumoto" } { last: "Matsumoto", first: "Yukihiro" }
Campos de consulta de um documento incorporado
A seguinte operação retorna documentos na coleção bios onde o documento integrado name
contém um campo first
com o valor "Yukihiro"
e um campo last
com o valor "Matsumoto"
. A consulta usa notação de ponto para acessar campos em um documento incorporado:
db.bios.find( { "name.first": "Yukihiro", "name.last": "Matsumoto" } )
A consulta corresponde ao documento onde o campo name
contém um documento incorporado com o campo first
com o valor "Yukihiro"
e um campo last
com o valor "Matsumoto"
. Por exemplo, a consulta corresponderia documentos com campos name
que possuíam um dos seguintes valores:
{ first: "Yukihiro", aka: "Matz", last: "Matsumoto" } { last: "Matsumoto", first: "Yukihiro" }
Para obter mais informações e exemplos, consulte também Consulta sobre documentos incorporados/aninhados.
Consulta em arrays
Consulta para um elemento de array
Os exemplos a seguir fazem consulta na array contribs
na coleção bios.
A operação a seguir retorna documentos na coleção bios em que o campo array
contribs
contém o elemento"UNIX"
:db.bios.find( { contribs: "UNIX" } ) A operação a seguir retorna documentos na coleção bios em que o campo array
contribs
contém o elemento"ALGOL"
ou"Lisp"
:db.bios.find( { contribs: { $in: [ "ALGOL", "Lisp" ]} } ) A operação a seguir usa o operador de consulta
$all
para retornar documentos na coleção bios onde o campo arraycontribs
contém os elementos"ALGOL"
e"Lisp"
:db.bios.find( { contribs: { $all: [ "ALGOL", "Lisp" ] } } ) Para mais exemplos, consulte
$all
. Consulte também$elemMatch
.A seguinte operação utiliza o operador
$size
para retornar documentos na coleção bios onde o tamanho da arraycontribs
é 4:db.bios.find( { contribs: { $size: 4 } } )
Para obter mais informações e exemplos de consulta em arrays, consulte:
Para obter uma lista de operadores de consulta específicos de array, consulte Array.
Consultas em array de documentos
Os exemplos a seguir fazem consulta na array awards
na coleção bios.
A operação a seguir retorna documentos na coleção bios em que a array
awards
contém um elemento com o campoaward
igual a"Turing Award"
:db.bios.find( { "awards.award": "Turing Award" } ) A operação a seguir retorna documentos na coleção bios em que a array
awards
contém pelo menos um elemento com o campoaward
igual a"Turing Award"
e o campoyear
maior que 1980:db.bios.find( { awards: { $elemMatch: { award: "Turing Award", year: { $gt: 1980 } } } } ) Use o operador
$elemMatch
para especificar vários critérios em um elemento array.
Para obter mais informações e exemplos de consulta em arrays, consulte:
Para obter uma lista de operadores de consulta específicos de array, consulte Array.
query para expressões regulares BSON
Para localizar documentos que contenham expressões regulares BSON como valores, chame find()
com a opção bsonRegExp
definida como true
. A opção bsonRegExp
permite retornar expressões regulares que não podem ser representadas como expressões regulares JavaScript.
A operação a seguir retorna documentos em uma collection chamada testbson
onde o valor de um campo chamado foo
é do tipo BSONRegExp
:
db.testbson.find( {}, {}, { bsonRegExp: true } )
[ { _id: ObjectId('65e8ba8a4b3c33a76e6cacca'), foo: BSONRegExp('(?-i)AA_', 'i') } ]
Projeções
O parâmetro projeção define os campos a retornar. O parâmetro contém especificações de inclusão ou exclusão, não ambas, a menos que a exclusão seja para o campo _id
.
Observação
A menos que o campo _id
seja explicitamente excluído no documento de projeção _id: 0
, o campo _id
é retornado.
Especifique os campos a serem retornados
A operação a seguir localiza todos os documentos na coleção bios e retorna apenas os campos name
, contribs
e _id
:
db.bios.find( { }, { name: 1, contribs: 1 } )
Observação
A menos que o campo _id
seja explicitamente excluído no documento de projeção _id: 0
, o campo _id
é retornado.
Campos excluídos explicitamente
A seguinte operação faz uma consulta da coleção bios e retorna todos os campos exceto o campo first
no documento incorporado name
e o campo birth
:
db.bios.find( { contribs: 'OOP' }, { 'name.first': 0, birth: 0 } )
Excluir explicitamente o _id
campo
Observação
A menos que o campo _id
seja explicitamente excluído no documento de projeção _id: 0
, o campo _id
é retornado.
A operação a seguir localiza documentos na coleção bios e retorna apenas o campo name
e o campo contribs
:
db.bios.find( { }, { name: 1, contribs: 1, _id: 0 } )
Em arrays e documentos incorporados
A operação a seguir consulta a coleção bios e retorna o campo last
no documento incorporado name
e os dois primeiros elementos na array contribs
:
db.bios.find( { }, { _id: 0, 'name.last': 1, contribs: { $slice: 2 } } )
Você também pode especificar campos incorporados usando o formulário aninhado. Por exemplo:
db.bios.find( { }, { _id: 0, name: { last: 1 }, contribs: { $slice: 2 } } )
Use expressão de agregação
A projeção db.collection.find()
pode aceitar expressões de agregação e sintaxe.
Com o uso de expressões de agregação e sintaxe, você pode projetar novos campos ou projetar campos existentes com novos valores. Por exemplo, a seguinte operação utiliza expressões de agregação para substituir o valor dos campos name
e awards
como também para incluir novos campos reportDate
, reportBy
e reportNumber
.
db.bios.find( { }, { _id: 0, name: { $concat: [ { $ifNull: [ "$name.aka", "$name.first" ] }, " ", "$name.last" ] }, birth: 1, contribs: 1, awards: { $cond: { if: { $isArray: "$awards" }, then: { $size: "$awards" }, else: 0 } }, reportDate: { $dateToString: { date: new Date(), format: "%Y-%m-%d" } }, reportBy: "hellouser123", reportNumber: { $literal: 1 } } )
Para definir o campo reportRun
para o valor 1
A operação retorna os seguintes documentos:
{ "birth" : ISODate("1924-12-03T05:00:00Z"), "contribs" : [ "Fortran", "ALGOL", "Backus-Naur Form", "FP" ], "name" : "John Backus", "awards" : 4, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1927-09-04T04:00:00Z"), "contribs" : [ "Lisp", "Artificial Intelligence", "ALGOL" ], "name" : "John McCarthy", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1906-12-09T05:00:00Z"), "contribs" : [ "UNIVAC", "compiler", "FLOW-MATIC", "COBOL" ], "name" : "Grace Hopper", "awards" : 4, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1926-08-27T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "name" : "Kristen Nygaard", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1931-10-12T04:00:00Z"), "contribs" : [ "OOP", "Simula" ], "name" : "Ole-Johan Dahl", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1956-01-31T05:00:00Z"), "contribs" : [ "Python" ], "name" : "Guido van Rossum", "awards" : 2, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1941-09-09T04:00:00Z"), "contribs" : [ "UNIX", "C" ], "name" : "Dennis Ritchie", "awards" : 3, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1965-04-14T04:00:00Z"), "contribs" : [ "Ruby" ], "name" : "Matz Matsumoto", "awards" : 1, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "birth" : ISODate("1955-05-19T04:00:00Z"), "contribs" : [ "Java" ], "name" : "James Gosling", "awards" : 2, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 } { "contribs" : [ "Scala" ], "name" : "Martin Odersky", "awards" : 0, "reportDate" : "2020-06-05", "reportBy" : "hellouser123", "reportNumber" : 1 }
Iterar o cursor devolvido
O método find()
retorna um cursor para os resultados.
Em mongosh
, se o cursor retornado não for atribuído a uma variável utilizando a palavra-chave var
, o cursor será automaticamente iterado para acessar até os primeiros 20 documentos que corresponderem à consulta. Você pode atualizar a variável displayBatchSize
para alterar o número de documentos iterados automaticamente.
O exemplo a seguir define o tamanho do lote como 3. Futuras operações de db.collection.find()
retornarão apenas 3 documentos por iteração do cursor.
config.set( "displayBatchSize", 3 )
Para iterar manualmente sobre os resultados, atribua o cursor retornado a uma variável com a palavra-chave var
, conforme mostrado nas seções a seguir.
Com nome da variável
O exemplo a seguir usa a variável myCursor
para iterar sobre o cursor e imprimir os documentos correspondentes:
var myCursor = db.bios.find( ); myCursor
Com next()
o método
O exemplo a seguir utiliza o método do cursor next()
para acessar os documentos:
var myCursor = db.bios.find( ); var myDocument = myCursor.hasNext() ? myCursor.next() : null; if (myDocument) { var myName = myDocument.name; print (tojson(myName)); }
Para imprimir, você também pode utilizar o método printjson()
em vez de print(tojson())
:
if (myDocument) { var myName = myDocument.name; printjson(myName); }
Com forEach()
o método
O exemplo a seguir usa o método de cursor forEach()
para iterar o cursor e acessar os documentos:
var myCursor = db.bios.find( ); myCursor.forEach(printjson);
Modificar o comportamento do cursor
mongosh
e os drivers fornecem vários métodos de cursor que chamam o cursor retornado pelo método find()
para modificar seu comportamento.
Ordene documentos no conjunto de resultados
O método sort()
ordena os documentos no conjunto de resultados. A operação a seguir retorna documentos na coleção bios classificados em ordem crescente pelo campo name
:
db.bios.find().sort( { name: 1 } )
sort()
corresponde à instrução ORDER BY
em SQL.
Limite o número de documentos a serem devolvidos
O método limit()
limita o número de documentos no conjunto de resultados. A operação a seguir retorna no máximo 5
documentos na coleção de bios:
db.bios.find().limit( 5 )
limit()
corresponde à instrução LIMIT
em SQL.
Defina o ponto inicial do conjunto de resultados
O método skip()
controla o ponto de partida do conjunto de resultados. A operação a seguir ignora os primeiros documentos 5
na coleção de bios e retorna todos os documentos restantes:
db.bios.find().skip( 5 )
Especifique o agrupamento
A colocação permite que os usuários especifiquem regras específicas do idioma para comparação de strings, como regras para letras maiúsculas e marcas de acento.
O método collation()
especifica o agrupamento para a operação db.collection.find()
.
db.bios.find( { "name.last": "hopper" } ).collation( { locale: "en_US", strength: 1 } )
Combinar métodos do cursor
As instruções a seguir encadeiam os métodos do cursorlimit()
e sort()
:
db.bios.find().sort( { name: 1 } ).limit( 5 ) db.bios.find().limit( 5 ).sort( { name: 1 } )
As duas afirmações são equivalentes; ou seja, a ordem em que você encadeia os métodoslimit()
e sort()
não é significativa. Ambas as instruções retornam os cinco primeiros documentos, conforme determinado pela ordem de classificação crescente em "nome".
Métodos do mongosh
cursor disponíveis
Usar variáveis na let
opção
Você pode especificar opções de consulta para modificar o comportamento da consulta e indicar como os resultados são retornados.
Por exemplo, para definir variáveis que você pode acessar em outro lugar no método find
, utilize a opção let
. Para filtrar os resultados utilizando uma variável, você deve acessar a variável dentro do operador $expr
.
Criar uma coleção cakeFlavors
:
db.cakeFlavors.insertMany( [ { _id: 1, flavor: "chocolate" }, { _id: 2, flavor: "strawberry" }, { _id: 3, flavor: "cherry" } ] )
O exemplo a seguir define uma variável targetFlavor
em let
e usa a variável para recuperar o sabor do bolo de chocolate:
db.cakeFlavors.find( { $expr: { $eq: [ "$flavor", "$$targetFlavor" ] } }, { _id: 0 }, { let : { targetFlavor: "chocolate" } } )
Saída:
[ { flavor: 'chocolate' } ]
Recuperar Documentos para Funções Concedidas ao Usuário Atual
A partir do MongoDB 7.0, você pode usar a nova variável de sistemaUSER_ROLES
para retornar funções de usuário .
O cenário nesta section mostra users com várias roles que têm acesso limitado a documents em uma coleção que contém information sobre budget.
O cenário mostra um possível uso de USER_ROLES
. A coleção budget
contém documentos com um campo denominado allowedRoles
. Como você verá no cenário a seguir, você pode escrever queries que comparam as funções de usuário encontradas no campo allowedRoles
com as funções retornadas pela variável de sistema USER_ROLES
.
Observação
Para outro cenário de exemplo USER_ROLES
, consulte Recuperar informações médicas para funções concedidas ao usuário atual. Esse exemplo não armazena as funções de usuário nos campos do documento, como é feito no exemplo a seguir.
Para o cenário de orçamento nesta seção, execute as seguintes etapas para criar as roles, os usuários e a collection budget
:
Criar os usuários
Crie usuários nomeados John
e Jane
com os papéis exigidos. Substitua o banco de dados test
pelo nome do banco de dados.
db.createUser( { user: "John", pwd: "jn008", roles: [ { role: "Marketing", db: "test" }, { role: "Development", db: "test" }, { role: "Operations", db: "test" }, { role: "read", db: "test" } ] } ) db.createUser( { user: "Jane", pwd: "je009", roles: [ { role: "Sales", db: "test" }, { role: "Operations", db: "test" }, { role: "read", db: "test" } ] } )
Criar a coleção
Executar:
db.budget.insertMany( [ { _id: 0, allowedRoles: [ "Marketing" ], comment: "For marketing team", yearlyBudget: 15000 }, { _id: 1, allowedRoles: [ "Sales" ], comment: "For sales team", yearlyBudget: 17000, salesEventsBudget: 1000 }, { _id: 2, allowedRoles: [ "Operations" ], comment: "For operations team", yearlyBudget: 19000, cloudBudget: 12000 }, { _id: 3, allowedRoles: [ "Development" ], comment: "For development team", yearlyBudget: 27000 } ] )
Execute as seguintes etapas para recuperar os documentos acessíveis a John
:
Recuperar os documentos
Para usar uma variável do sistema, adicione $$
ao início do nome da variável. Especifique a variável de sistema USER_ROLES
como $$USER_ROLES
.
Executar:
db.budget.find( { $expr: { $not: { $eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ] } } } )
O exemplo anterior retorna os documentos da coleção budget
que correspondem a pelo menos uma das funções que o usuário que executa o exemplo tem. Para fazer isso, o exemplo usa $setIntersection
para retornar documentos em que a interseção entre o budget
campo de documento allowedRoles
e o conjunto de funções de usuários de $$USER_ROLES
não está vazia.
Examine os documentos
John
tem as funções Marketing
, Operations
e Development
e vê estes documentos:
[ { _id: 0, allowedRoles: [ 'Marketing' ], comment: 'For marketing team', yearlyBudget: 15000 }, { _id: 2, allowedRoles: [ 'Operations' ], comment: 'For operations team', yearlyBudget: 19000, cloudBudget: 12000 }, { _id: 3, allowedRoles: [ 'Development' ], comment: 'For development team', yearlyBudget: 27000 } ]
Execute as seguintes etapas para recuperar os documentos acessíveis a Jane
:
Examine os documentos
Jane
tem as funções Sales
e Operations
e vê estes documentos:
[ { _id: 1, allowedRoles: [ 'Sales' ], comment: 'For sales team', yearlyBudget: 17000, salesEventsBudget: 1000 }, { _id: 2, allowedRoles: [ 'Operations' ], comment: 'For operations team', yearlyBudget: 19000, cloudBudget: 12000 } ]
Observação
Em um cluster fragmentado, uma query pode ser executada em um fragmento por outro nó de servidor em nome do usuário. Nestas queries, o USER_ROLES
ainda é preenchido com as funções do usuário.
Modificar uma query com opções
Os exemplos seguintes mostram como você pode utilizar o campo options
em uma query do find()
. Use o seguinte insertMany()
para configurar a coleção users
:
db.users.insertMany( [ { username: "david", age: 27 }, { username: "amanda", age: 25 }, { username: "rajiv", age: 32 }, { username: "rajiv", age: 90 } ] )
limite com opções
A query a seguir limita o número de documentos no conjunto de resultados com o parâmetro de opções limit
:
db.users.find( { username : "rajiv"}, // query { age : 1 }, // projection { limit : 1 } // options )
allowDiskUse com opções
A query a seguir utiliza o parâmetro options
para habilitar allowDiskUse
:
db.users.find( { username : "david" }, { age : 1 }, { allowDiskUse : true } )
explicar com opções
A consulta a seguir usa o parâmetro options
para obter a saída de explicação executionStats
:
var cursor = db.users.find( { username: "amanda" }, { age : 1 }, { explain : "executionStats" } ) cursor.next()
Especifique várias opções em uma query
A seguinte query usa múltiplos options
em uma única query. Essa query usa limit
definida como 2
para retornar apenas dois documentos e showRecordId
definida como true
para retornar a posição do documento no conjunto de resultados:
db.users.find( {}, { username: 1, age: 1 }, { limit: 2, showRecordId: true } )