MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

MongoDB findOne()


No MongoDB o db.collection.findOne() O método retorna um documento que atende aos critérios de consulta especificados na coleção ou exibição.

A collection parte é o nome da coleção ou visualização a ser pesquisada.

findOne() é semelhante a find() , exceto que findOne() retorna apenas o primeiro documento que corresponde aos critérios do filtro, de acordo com a ordem natural que reflete a ordem dos documentos no disco.

O find() por outro lado, retorna todos os documentos correspondentes.

Além disso, findOne() retorna o documento real, enquanto find() apenas retorna um cursor para cada documento. Portanto, você não pode aplicar métodos de cursor a findOne() como você pode com find() .

Exemplo


Suponha que tenhamos uma coleção chamada pets com os seguintes documentos:
{ "_id" :1, "name" :"Wag", "type" :"Dog", "weight" :20 }{ "_id" :2, "name" :"Latido", "tipo" :"Dog", "weight" :10 }{ "_id" :3, "name" :"Miau", "type" :"Cat", "weight" :7 }{ "_id" :4, "name" :"Scratch", "type" :"Cat", "weight" :8 }{ "_id" :5, "name" :"Bruce", "type" :"Bat", "weight" :3 } 
Podemos usar findOne() para devolver um documento.
db.pets.findOne() 

Resultado:
{ "_id" :1, "name" :"Wag", "type" :"Cão", "peso" :20 }

Aqui, pesquisamos todos os documentos no pets coleção. Sabemos que isso pesquisou todos os documentos porque não fornecemos nenhum critério de filtragem. Nem sequer fornecemos argumentos.

Quando chamado sem argumentos, findOne() pesquisa todos os documentos de uma coleção e retorna todos os campos do documento correspondente.

Outra maneira de fazer o acima é assim:
db.pets.findOne({}) 

Neste caso passamos um documento vazio.

Ao adicionar a este documento vazio, podemos começar a filtrar os resultados.

Forneça uma consulta


A sintaxe real de findOne() fica assim:
db.collection.findOne(query, projection) 

Isso significa que você pode passar uma consulta como o primeiro argumento e uma projeção como o segundo.

Se você passar uma consulta, ela será usada para filtrar o escopo da pesquisa apenas para os documentos que correspondem à consulta. Uma consulta é um documento que contém operadores de consulta. Como vimos no exemplo anterior, um documento vazio retorna todos os documentos.

Vamos restringir os resultados a um subconjunto de documentos na coleção.
db.pets.findOne({"type":"Cat"}) 

Resultado:
{ "_id" :3, "name" :"Miau", "type" :"Gato", "peso" :7 }

Isso restringiu a pesquisa apenas aos documentos que têm um type campo com um valor de Cat , então findOne() retornou o primeiro documento desse resultado.

Nesse caso, simplesmente passamos um documento como critério de filtragem.

Você também pode usar operadores de consulta. Eles permitem que você aplique critérios mais específicos à sua consulta.

Exemplo:
db.pets.findOne({"weight": { $lt: 10 }}) 

Resultado:
{ "_id" :3, "name" :"Miau", "type" :"Gato", "peso" :7 }

Documentos incorporados


Se você tiver documentos que contenham documentos incorporados, poderá usar os métodos a seguir para consultar dados nos documentos incorporados.
  • Notação de ponto (por exemplo, field.nestedfield: <value> )
  • Formulário aninhado (por exemplo, { field: { nestedfield: <value> } } ). Observe que esta opção está disponível apenas no MongoDB 4.4.

Suponha que inserimos o seguinte documento.
db.pets.insertOne({ "_id" :6, "name" :"Buscar", "tipo" :"Cão", "especificações" :{ "altura" :400, "peso" :15, " color" :"marrom" }})

Podemos usar a notação de ponto para consultar o documento incorporado.
db.pets.findOne({ "specs.height": 400 }) 

Resultado:
{ "_id" :6, "name" :"Buscar", "type" :"Dog", "specs" :{ "height" :400, "weight" :15, "color" :"brown" }}

A consulta a seguir retorna o mesmo documento, exceto que desta vez fazemos referência ao documento incorporado usando o formulário aninhado.
db.pets.findOne({ 
    "specs" : {
		"height" : 400,
		"weight" : 15,
		"color" : "brown"
	}
 }) 

Resultado:
{ "_id" :6, "name" :"Buscar", "type" :"Dog", "specs" :{ "height" :400, "weight" :15, "color" :"brown" }}

Ao usar o formulário aninhado, a consulta deve corresponder exatamente a todo o documento incorporado. Por exemplo, a consulta a seguir não corresponde:
db.pets.findOne({ 
    "specs" : {
		"height" : 400
	}
 }) 

Resultado:
nulo

Matrizes


Você pode fazer referência a dados em matrizes referenciando o elemento da matriz por seu índice ou por seu valor.

Suponha que inserimos o seguinte documento:
db.pets.insertOne({ "_id" :7, "name" :"Jake", "type" :"Dog", "awards" :[ "Top Dog", "Best Dog", "Biggest Dog" " ]})

Se quiséssemos encontrar todos os cães com o prêmio Top Dog, poderíamos escrever a seguinte consulta (que retornará o cão acima).
db.pets.findOne({ 
    "awards": "Top Dog"
}) 

Resultado:
{ "_id" :7, "name" :"Jake", "type" :"Dog", "awards" :[ "Top Dog", "Best Dog", "Biggest Dog" ]}

Você também pode especificar o índice do elemento, assim:
db.pets.findOne({ 
    "awards.0": "Top Dog"
}) 

Fazer isso requer que o valor especificado esteja no índice especificado. Portanto, a consulta a seguir não retorna o mesmo cão.
db.pets.findOne({ 
    "awards.1": "Top Dog"
}) 

Observe que as matrizes são baseadas em zero, portanto, um índice de 0 especifica o primeiro elemento, 1 especifica o segundo elemento e assim por diante.

Projeções


Por padrão, todos os campos do documento são retornados quando você usa findOne() . Mas você pode usar projeções para reduzir o número de campos retornados, se necessário.

Você deve se lembrar que a sintaxe para findOne() fica assim:
db.collection.findOne(query, projection) 

Onde query fornece os critérios de filtragem (que fizemos nos exemplos acima) e projection é uma projeção opcional que especifica quais campos retornar de qualquer documento correspondente. Portanto, se quisermos usar uma projeção, simplesmente a colocamos após a consulta.

Ao usar uma projeção, você pode especificar os campos para incluir , os campos a excluir , ou ambos. Para fazer isso, liste o nome do campo e um 1 (para incluí-lo) ou 0 (para excluí-lo).

Aqui está um exemplo de como usar uma projeção para especificar os campos a serem incluídos:
db.pets.findOne({}, { name: 1, type: 1 }) 

Resultado:
{ "_id" :1, "name" :"Wag", "type" :"Cachorro" }

Observe que o _id campo é retornado mesmo que não o tenhamos incluído em nossa projeção. Este campo é uma exceção e é incluído por padrão.

Se você não quiser o _id campo a ser retornado, você precisa excluí-lo explicitamente.
db.pets.findOne({}, { _id: 0, name: 1, type: 1 }) 

Resultado:
{ "name" :"Wag", "type" :"Cachorro" }

Aqui está outro exemplo, desta vez especificamos apenas quais campos excluir.
db.pets.findOne({}, { _id: 0, weight: 0, specs: 0, awards: 0 }) 

Resultado:
{ "name" :"Wag", "type" :"Cachorro" }

Mais projeções


Há várias outras coisas que você pode fazer com projeções. Por exemplo, a partir do MongDB 4.4, você pode usar expressões agregadas para especificar o valor de um campo projetado.

Exemplo:
db.pets.findOne({}, { 
    "_id": 0,
    "n": "$name", 
    "t": "$type", 
    "w": "$weight" 
    }) 

Resultado:
{ "n" :"Abanar", "t" :"Cachorro", "w" :20 }

Aqui, renomeamos os nomes dos campos. Fizemos isso especificando um novo nome para cada campo como uma string literal, usando o $fieldName sintaxe para gerar esse valor de campos. O resultado é um pouco como usar aliases no SQL.

Mais informações


Consulte a documentação do MongoDB para obter mais informações.