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 / 22813
Accepted
user4951
user4951
Asked: 2012-08-21 23:11:44 +0800 CST2012-08-21 23:11:44 +0800 CST 2012-08-21 23:11:44 +0800 CST

Mongodb - Retornando os pontos mais próximos de um local, com distância

  • 772

Qual é o equivalente do MongoDB para esta consulta:

SELECT 111151.29341326 * SQRT( pow(-6.186753-`Latitude`, 2) 
                               + pow(106.772835-`Longitude`, 2)
                                 * cos(-6.186753*0.017453292519943)
                                 * cos(`Latitude`*0.017453292519943)
                             )
       as distance
from tablename ;

Isso usa a fórmula de Haversine para calcular a distância do grande círculo a um ponto fixo. Queremos chegar mais perto de 20 pontos de um local e, em seguida, exibir a distância.

mysql mongodb
  • 1 1 respostas
  • 13479 Views

1 respostas

  • Voted
  1. Best Answer
    Adam C
    2012-08-22T01:49:46+08:002012-08-22T01:49:46+08:00

    O MongoDB tem suporte integrado para geoindexação. Você não precisa fazer o cálculo sozinho.

    Basicamente, você criaria um campo com a lat/long armazenada como uma matriz ou como subdocumentos, algo como um destes:

    { loc : [ 50 , 30 ] } //SUGGESTED OPTION
    { loc : { x : 50 , y : 30 } }
    { loc : { lon : 40.739037, lat: 73.992964 } }
    

    Em seguida, indexe o novo campo loc apropriadamente:

    db.places.ensureIndex( { loc : "2d" } )
    

    Finalmente, você pode usar um dos operadores para consultar um ponto para os 20 resultados mais próximos:

    db.places.find( { loc : { $near : [50,50] } } ).limit(20)
    

    Você poderia, é claro, apenas usar o MongoDB para armazenar os dados, extrair as informações do banco de dados com um find () e fazer o cálculo do lado do cliente, mas imagino que não seja isso que você deseja fazer.

    Se a parte da distância da equação for o que você deseja:

    http://www.mongodb.org/display/DOCS/Geospatial+Indexing#GeospatialIndexing-geoNearCommand

    O operador $geoNear também retornará a distância. Um exemplo:

    > db.runCommand( { geoNear : "places" , near : [50,50], num : 10 } );
    {
            "ns" : "test.places",
            "near" : "1100110000001111110000001111110000001111110000001111",
            "results" : [
                    {
                            "dis" : 69.29646421910687,
                            "obj" : {
                                    "_id" : ObjectId("4b8bd6b93b83c574d8760280"),
                                    "y" : [
                                            1,
                                            1
                                    ],
                                    "category" : "Coffee"
                            }
                    },
                    {
                            "dis" : 69.29646421910687,
                            "obj" : {
                                    "_id" : ObjectId("4b8bd6b03b83c574d876027f"),
                                    "y" : [
                                            1,
                                            1
                                    ]
                            }
                    }
            ],
            "stats" : {
                    "time" : 0,
                    "btreelocs" : 1,
                    "btreelocs" : 1,
                    "nscanned" : 2,
                    "nscanned" : 2,
                    "objectsLoaded" : 2,
                    "objectsLoaded" : 2,
                    "avgDistance" : 69.29646421910687
            },
            "ok" : 1
    }
    

    Os "dis" : 69.29646421910687elementos são o que você procura, também há uma opção de distância esférica.

    Por tudo isso, como usar as distâncias e muito mais, veja aqui mais informações sobre geoíndices e como usá-los:

    http://www.mongodb.org/display/DOCS/Geospatial+Indexing/

    • 7

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

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

    Como ver a lista de bancos de dados no Oracle?

    • 8 respostas
  • Marko Smith

    Quão grande deve ser o mysql innodb_buffer_pool_size?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    restaurar a tabela do arquivo .frm e .ibd?

    • 10 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

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

    • 4 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

    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
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +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
    bernd_k Quando devo usar uma restrição exclusiva em vez de um índice exclusivo? 2011-01-05 02:32:27 +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