Quando você usa métodos como
find()
ou findOne()
no MongoDB, por padrão, você obtém todo o documento retornado. E se você usar projeções, poderá retornar pares de chave/valor específicos. Mas e se você quiser apenas o valor?
Você pode extrair o valor de um campo anexando o nome desse campo à sua consulta ao usar
findOne()
. Exemplo
Suponha que tenhamos uma coleção chamada
products
com os seguintes documentos:{ "_id" :1, "product" :"Bat", "sizes" :[ "S", "M", "L" ] }{ "_id" :2, "product" :"Hat" , "sizes" :[ "S", "L", "XL" ] }{ "_id" :3, "product" :"Cap", "sizes" :[ "M", "L" ] }
Se quiséssemos devolver o produto do primeiro documento, poderíamos fazer o seguinte:
db.products.findOne().product
Resultado:
Morcego
Observe que usamos ofindOne()
método. Esta técnica não funciona nofind()
método. OfindOne()
retorna um único documento, enquanto o métodofind()
O método simplesmente retorna um cursor para o documento.
Se quiséssemos retornar o array, poderíamos fazer isso:
db.products.findOne().sizes
Resultado:
[ "S", "M", "L" ]
E podemos obter um valor de matriz referenciando seu índice:
db.products.findOne().sizes[0]
Resultado:
S
As matrizes são baseadas em zero e, portanto,0
referencia o primeiro elemento na matriz,1
referencia o segundo elemento,2
o terceiro, e assim por diante.
Documento específico
Por padrão, ofindOne()
retorna o primeiro documento da coleção. Podemos selecionar um documento diferente especificando a passagem de uma consulta como o primeiro argumento.
Eu digo “primeiro argumento” porquefindOne()
também aceita umaprojection
argumento como um segundo argumento opcional.
db.products.findOne({_id: 2}, {sizes: 1, _id: 0}).sizes
Resultado:
[ "S", "L", "XL" ]
Nesse caso, adicionei um argumento de projeção, mas não teve efeito no resultado. Mas teria um efeito se eu tivesse especificado um valor de 0. Isso resultaria em nada sendo retornado.
Documentos incorporados
Você pode usar a notação de ponto para retornar valores de documentos incorporados
Exemplo de documento:
{ "_id" :1, "name" :"Wag", "details" :{ "type" :"Dog", "weight" :20 }}
Poderíamos fazer o seguinte para retornar um valor do documento incorporado:
db.pets.findOne().details.type
Resultado:
Cão