Estou trabalhando em um projeto e não tenho certeza se há uma diferença entre a maneira como o find
cursor funciona e a maneira como o findOne
cursor funciona. O findOne é apenas um wrapper para find().limit(1)
? Eu estava procurando por isso e talvez alguém saiba se o mongodb tem um método especial para isso ou não. Estou trabalhando com a API PHP para mongodb se isso fizer diferença.
Com base em meus próprios benchmarks,
find().limit(1)
é ordens de magnitude mais rápida quefindOne()
.Há um erro na documentação do MongoDB ou um bug no
findOne()
.findOne()
executa mais comofind().limit(N)
onde N é o número de documentos que a consulta retornaria. Eu descobri isso enquanto tentava descobrir por que minhas consultas simples eram tão lentas!atualização: resposta de um engenheiro 10gen (MongoDB):
Atualização: De fato, se o
find().limit(1)
documento for recuperado, as ordens de magnitude da diferença de velocidade parecem desaparecer. Além disso, não consegui reproduzir a principal diferença de velocidade com o driver JavaScript do MongoDB. Eu originalmente fiz o benchmark usando o driver MongoDB Java.findOne()
é de fato açúcar sintático parafind().limit(1)
, dado que você está realmente recuperando o documento (em vez de apenas retornar o cursor comfind()
).Veja a resposta e as atualizações do Leftium para mais detalhes.
O código fonte pode ajudar muito.
É java, mas acho que pode ajudar também.
O
findOne()
,E aqui está
find()
Como podemos ver que
findOne()
chama emfind()
si mesmo, pega tudo e depois retorna o primeiro.DBOject
i
Você deve verificar este link ...
http://mongoosejs.com/docs/2.7.x/docs/finding-documents.html