Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

db.collection.find()

Nesta página

  • Definição
  • Compatibilidade
  • Sintaxe
  • Comportamento
  • Exemplos
  • Saiba mais
db.collection.find(query, projection, options)

Importante

Método mongosh

Esta página documenta um método mongosh . Esta não é a documentação para comandos de banco de dados ou drivers específicos de idioma, como Node.js.

Para o comando do banco de dados, consulte o comando find.

Para drivers de API do MongoDB, consulte a documentação do driver MongoDB específica do idioma.

Para a documentação de shell legada do mongo, consulte a documentação para a versão correspondente do MongoDB Server:

mongo shell v4.4

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 query . Quando o método find() "retorna documentos," o método está, na verdade, retornando um cursor para os documentos.

Você pode utilizar o db.collection.find() para implantações hospedadas nos seguintes ambientes:

  • MongoDB Atlas: o serviço totalmente gerenciado para implantações MongoDB na nuvem

O método find() tem o seguinte formulário:

db.collection.find( <query>, <projection>, <options> )

O método find() utiliza os seguintes parâmetros:

Parâmetro
Tipo
Descrição
Query
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 query filter. Para retornar todos os campos nos documentos correspondentes, omita este parâmetro. Para obter detalhes, consulte Projeção.

documento

Opcional. Especifica opções adicionais para a query. Estas opções modificam o comportamento da query e como os resultados são retornados. Para obter detalhes, consulte Opções.

Importante

Consistência de linguagem

Como parte da criação da projeção find() e findAndModify() consistente com o estágio $project da agregação,

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 $ para retornar o primeiro elemento que corresponde à condição de consulta no campo de array. Se você especificar um número inteiro diferente de zero para o valor de projeção, a operação tratará o valor como true.

Não disponível para visualizações.

<field>: <array projection>

Usa os operadores de projeção de array ($elemMatch, $slice) para especificar os elementos da array a serem incluídos.

Não disponível para visualizações.

<field>: <$meta expression>

Usa a expressão do operador $meta para especificar a inclusão de per-document metadatadisponíveis .

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.

  • Se você especificar um literal não numérico e não booleano (como uma string literal ou um array ou uma expressão de operador) para o valor de projeção, o campo será projetado com o novo valor, por exemplo:

    • { field: [ 1, 2, 3, "$someExistingField" ] }

    • { field: "New String Value" }

    • { field: { status: "Active", total: { $sum: "$existingArray" } } }

  • Para projetar um valor literal para um campo, utilize a expressão de agregação $literal; por exemplo:

    • { field: { $literal: 5 } }

    • { field: { $literal: true } }

    • { field: { $literal: { fieldWithValue0: 0, fieldWithValue1: 1 } } }

Nas versões 4.2 e anterior, qualquer valor de especificação (com exceção do valor de documento anteriormente não suportado) é tratado como true ou false para indicar a inclusão ou exclusão do campo.

Opção
Descrição
Permitir o uso do disco
Se os pipelines que exigem mais de 100 megabytes de memória para serem executados gravam ou não em arquivos temporários no disco. Para detalhes, consulte cursor.allowDiskUse().
allowPartialResults
Para queries em relação a uma coleção fragmentada, permite que o comando (ou comandos subsequentes getMore) 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 tailable-await. Requer que o tailable seja true.
Agrupamento
Configurações de agrupamento para operação de atualização.
comentário
Adiciona um $comment à query que mostra nos registros do criador de perfil .
explicar
Os anúncios explicam a saída com base no modo de verbosidade fornecido.
dica
Força o otimizador de query a usar índices específicos na query.
limite
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 adaptável. Requer que tailable e awaitData sejam true.
maxTimeMS
A quantidade máxima 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 atingir o tempo limite do cursor após um período de inatividade (por padrão 10 minutos).
readConcern
Especifica o nível de read concern para a query.
readPreference
Especifica o nível de read preference para a query.
returnKey
Se apenas as chaves de í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 do conjunto de resultados.
sort
A ordem dos documentos retornados no conjunto de resultados. Os campos especificados na classificação devem ter um índice.
tailable
Indica se o cursor é tailable. Os cursores de ocorrências permanecem abertos após os resultados iniciais da query se esgotarem. Os cursores tailable estão disponíveis apenas em Capped Collections.

Para campos em documentos incorporados, você pode especificar o campo usando:

  • notação de pontos, por exemplo "field.nestedfield": <value>

  • formulário aninhado, por exemplo { field: { nestedfield: <value> } }

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.

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.

A execução db.collection.find() em mongosh itera automaticamente o cursor para exibir até os primeiros documentos 20 . 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.

Dica

Para especificar a preocupação de leitura para db.collection.find(), use o método cursor.readConcern() .

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.

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.

Os drivers e mongosh do MongoDB associam todas as operações a uma sessão de servidor, com exceção de operações de gravação não reconhecidas. Para operações não explicitamente associadas a uma sessão (ou seja, uso Mongo.startSession()), os drivers do 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.

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.

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.

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.

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 na coleção bios:

db.bios.find()
  • A seguinte operação retorna documentos na coleção bios onde _id é igual a 5:

    db.bios.find( { _id: 5 } )
  • A operação a seguir retorna documentos na coleção bios em que o campo last no documento incorporado name é 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>").

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 a 5 ou ObjectId("507c35dd8fada716c89d0013"):

    db.bios.find(
    { _id: { $in: [ 5, ObjectId("507c35dd8fada716c89d0013") ] } }
    )
  • A operação a seguir usa o operador $gt retorna todos os documentos da coleção bios onde birth é maior que new 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 campo name.last começa com a letra N (ou é "LIKE N%")

    db.bios.find(
    { "name.last": { $regex: /^N/ } }
    )

Para obter uma lista dos operadores de consulta, consulte Seletores de consulta.

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.

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.

Os exemplos a seguir consultam o campo integrado name na coleção bios.

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"
}

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.

Os exemplos a seguir fazem consulta no 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 array contribs 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 do array contribs é 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.

Os exemplos a seguir fazem consulta no array awards na coleção bios.

  • A operação a seguir retorna documentos na coleção bios em que o array awards contém um elemento com o campo award igual a "Turing Award":

    db.bios.find(
    { "awards.award": "Turing Award" }
    )
  • A operação a seguir retorna documentos na coleção bios em que o array awards contém pelo menos um elemento com o campo award igual a "Turing Award" e o campo year 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.

O parâmetro projeção especifica quais campos retornar. O parâmetro contém especificações de inclusão ou exclusão, e 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.

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.

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 }
)

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 }
)

A operação a seguir consulta a coleção bios e retorna o campo last no documento incorporado name e os dois primeiros elementos no 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 } }
)

A projeção db.collection.find() pode aceitar expressões de aggregation 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 }

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 usando a palavra-chave var , o cursor será automaticamente iterado para acessar até os primeiros 20 documentos que correspondem à query. 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.

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

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);
}

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);

mongosh e os drivers fornecem vários métodos de cursor que ligam no cursor retornado pelo método find() para modificar seu comportamento.

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.

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.

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 )

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 } )

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".

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' } ]

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:

1

Executar:

db.createRole( { role: "Marketing", roles: [], privileges: [] } )
db.createRole( { role: "Sales", roles: [], privileges: [] } )
db.createRole( { role: "Development", roles: [], privileges: [] } )
db.createRole( { role: "Operations", roles: [], privileges: [] } )
2

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" }
]
} )
3

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:

1

Executar:

db.auth( "John", "jn008" )
2

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.

3

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:

1

Executar:

db.auth( "Jane", "je009" )
2

Executar:

db.budget.find( {
$expr: {
$not: {
$eq: [ { $setIntersection: [ "$allowedRoles", "$$USER_ROLES.role" ] }, [] ]
}
}
} )
3

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.

Os exemplos seguintes mostram como você pode utilizar o campo options em uma query do find() . Use o seguinte insertMany() para configurar a collection users :

db.users.insertMany( [
{ username: "david", age: 27 },
{ username: "amanda", age: 25 },
{ username: "rajiv", age: 32 },
{ username: "rajiv", age: 90 }
] )

A seguinte query 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
)

A seguinte consulta utiliza o parâmetro options para habilitar o allowDiskUse:

db.users.find(
{ username : "david" },
{ age : 1 },
{ allowDiskUse : true }
)

A seguinte query utiliza o parâmetro options para obter a saída de explicação do executionStats :

var cursor = db.users.find(
{ username: "amanda" },
{ age : 1 },
{ explain : "executionStats" }
)
cursor.next()

A seguinte query utiliza múltiplos options em uma única query. Esta query usa limit definido como 2 para retornar somente dois documentos e showRecordId definido como true para retornar a posição do documento no conjunto de resultados:

db.users.find(
{},
{ username: 1, age: 1 },
{
limit: 2,
showRecordId: true
}
)
← db.collection.explain()