AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 7573
Accepted
WojonsTech
WojonsTech
Asked: 2011-11-04 08:06:15 +0800 CST2011-11-04 08:06:15 +0800 CST 2011-11-04 08:06:15 +0800 CST

Diferença entre as chamadas find e findone do MongoDB

  • 772

Estou trabalhando em um projeto e não tenho certeza se há uma diferença entre a maneira como o findcursor funciona e a maneira como o findOnecursor 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.

mongodb
  • 4 4 respostas
  • 32996 Views

4 respostas

  • Voted
  1. Best Answer
    Leftium
    2011-11-04T17:44:24+08:002011-11-04T17:44:24+08:00

    Com base em meus próprios benchmarks, find().limit(1)é ordens de magnitude mais rápida que findOne().

    Há um erro na documentação do MongoDB ou um bug no findOne(). findOne()executa mais como find().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):

    As duas consultas que você está executando são muito diferentes. Uma consulta de localização retorna um cursor, este é essencialmente um cenário sem operação, pois nenhum dado real é retornado (apenas as informações do cursor). Se você chamar findOne, na verdade você está retornando os dados e fechando o cursor. Os documentos definitivamente devem ser mais claros :-)

    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.

    • 36
  2. Nick Chammas
    2011-11-04T09:49:03+08:002011-11-04T09:49:03+08:00

    findOne()é de fato açúcar sintático para find().limit(1), dado que você está realmente recuperando o documento (em vez de apenas retornar o cursor com find()).

    Veja a resposta e as atualizações do Leftium para mais detalhes.

    • 9
  3. shellbye
    2015-04-09T01:31:16+08:002015-04-09T01:31:16+08:00

    O código fonte pode ajudar muito.

    É java, mas acho que pode ajudar também.

    O findOne(),

    DBObject findOne(DBObject o, DBObject fields, DBObject orderBy, ReadPreference readPref,
                     long maxTime, TimeUnit maxTimeUnit) {
    
        QueryOpBuilder queryOpBuilder = new QueryOpBuilder().addQuery(o).addOrderBy(orderBy)
                                                            .addMaxTimeMS(MILLISECONDS.convert(maxTime, maxTimeUnit));
    
        if (getDB().getMongo().isMongosConnection()) {
            queryOpBuilder.addReadPreference(readPref);
        }
    
        Iterator<DBObject> i = find(queryOpBuilder.get(), fields, 0, -1, 0, getOptions(), readPref, getDecoder());
    
        DBObject obj = (i.hasNext() ? i.next() : null);
        if ( obj != null && ( fields != null && fields.keySet().size() > 0 ) ){
            obj.markAsPartialObject();
        }
        return obj;
    }
    

    E aqui estáfind()

    public DBCursor find( DBObject ref ){
        return new DBCursor( this, ref, null, getReadPreference());
    }
    

    Como podemos ver que findOne()chama em find()si mesmo, pega tudo e depois retorna o primeiro.DBOjecti

    • 3
  4. saturngalaxy
    2017-10-16T22:14:20+08:002017-10-16T22:14:20+08:00

    Você deve verificar este link ...

    http://mongoosejs.com/docs/2.7.x/docs/finding-documents.html

    1. find - opção return array []
    2. findOne - documento de retorno de opção {}
    • -1

relate perguntas

  • A fragmentação é eficaz para coleções pequenas?

  • Bons recursos para operar/administrar o MongoDB

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Como você mostra o SQL em execução em um banco de dados Oracle?

    • 2 respostas
  • Marko Smith

    Como selecionar a primeira linha de cada grupo?

    • 6 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Posso ver Consultas Históricas executadas em um banco de dados SQL Server?

    • 6 respostas
  • Marko Smith

    Como uso currval() no PostgreSQL para obter o último id inserido?

    • 10 respostas
  • Marko Smith

    Como executar o psql no Mac OS X?

    • 11 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Marko Smith

    Passando parâmetros de array para um procedimento armazenado

    • 12 respostas
  • Martin Hope
    Manuel Leduc Restrição exclusiva de várias colunas do PostgreSQL e valores NULL 2011-12-28 01:10:21 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Stuart Blackler Quando uma chave primária deve ser declarada sem cluster? 2011-11-11 13:31:59 +0800 CST
  • Martin Hope
    pedrosanta Listar os privilégios do banco de dados usando o psql 2011-08-04 11:01:21 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST
  • Martin Hope
    BrunoLM Guid vs INT - Qual é melhor como chave primária? 2011-01-05 23:46:34 +0800 CST
  • Martin Hope
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +0800 CST
  • Martin Hope
    Patrick Como posso otimizar um mysqldump de um banco de dados grande? 2011-01-04 13:13:48 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve