Como encontrar o motorista mais próximo em um app estilo Uber

Atrás de cada pedido de corrida há uma pergunta: quem está mais perto? Guarde as posições do jeito certo e o banco de dados responde por você, na ordem certa, sem uma linha de cálculo de distância.

O que este guia constrói: um banco de dados com as tabelas Driver, Passenger e PointOfInterest, cinco registros em cada uma, e uma coluna position guardando coordenadas de Nova York

Tradução do original em inglês, testado em 23 de setembro de 2026. Código, números e datas são os do original. Read in English

Alguém abre o app e toca no botão. Antes de o mapa aparecer, antes de um preço surgir, o sistema precisa responder a uma pergunta: de todos os motoristas por aí, qual está mais perto dessa pessoa agora?

Você não precisa resolver isso por conta própria. Guarde cada localização no tipo certo de campo e o banco de dados ordena todo mundo por distância para você, do mais próximo ao mais distante. A novidade é que você também não precisa mais montar isso à mão: um assistente de IA conectado à sua conta consegue criar as tabelas, preenchê-las e fazer a pergunta.

Este guia faz exatamente isso, e depois faz a parte que a maioria dos tutoriais pula: confere a resposta calculando as distâncias separadamente e comparando. Medido em 23 de setembro de 2026 — três tabelas em 516 ms, 15 registros em 729 ms.

Prefere assistir?

O passo a passo original constrói as mesmas três classes e faz a mesma pergunta sobre o motorista mais próximo, inteiramente em conversa.

Video: No Code Uber App
Watch it instead No Code Uber App
Do canal da Back4app. O modelo de dados e as perguntas são os mesmos; a ferramenta que ele usa para chegar ao backend não existe mais, e este guia usa o que a substituiu. Open on YouTube →

Como deve ser o modelo de dados?

Três classes e um tipo de campo. Motoristas, passageiros e pontos de interesse precisam, cada um, de um nome e de uma posição, e a posição tem de ser um GeoPoint, não um par de números.

Essa escolha é o guia inteiro em uma decisão. Um GeoPoint guarda latitude e longitude como um único valor, e é a única coisa que os operadores geoespaciais do Parse leem. Guarde os dois números separados e os dados continuam lá, mas $nearSphere e seus parentes deixam de estar disponíveis para você.

ClasseCampos
Drivername (String), position (GeoPoint)
Passengername (String), position (GeoPoint)
PointOfInterestname (String), position (GeoPoint)

Como conectar o cliente de IA?

Por um servidor MCP, que expõe sua conta Back4app ao assistente como um conjunto de ferramentas. Crie uma account key em Account Settings → Account Keys e aponte seu editor para o servidor — o pacote é baixado sob demanda.

{
  "mcpServers": {
    "back4app": {
      "command": "npx",
      "args": ["-y", "@back4app/mcp-server-back4app@latest",
               "--account-key", "YOUR_ACCOUNT_KEY"]
    }
  }
}

Duas das ferramentas dele carregam este guia: create_parse_app cria o app, e call_parse_server_rest_api faz todo o resto — definir schemas, inserir registros e rodar queries, em lotes.

Como criar as classes e os dados?

Descrevendo-os. O app foi criado primeiro, depois os três schemas, depois os registros — cada etapa uma instrução, não um arquivo.

Crie um app chamado uber-clone-demo. Nele, crie as classes Driver, Passenger e PointOfInterest, cada uma com uma string name e um GeoPoint position. Depois adicione cinco de cada, usando coordenadas reais de Nova York para os pontos de interesse.

Criar o app levou 3,4 segundos. Os três schemas voltaram juntos em 516 ms, cada um reportando os campos que tinha definido. Os 15 registros entraram em um único lote em 729 ms, todos os quinze devolvendo HTTP 201.

O Database browser mostrando a classe Driver com cinco registros: object ids, ACLs, nomes e uma coluna position

Para os pontos de referência, coordenadas reais importam: as distâncias mais adiante só fazem sentido se a Estátua da Liberdade estiver onde a Estátua da Liberdade está.

A classe PointOfInterest com Empire State Building, Central Park, Statue of Liberty, Times Square e Brooklyn Bridge, cada um com suas coordenadas em GeoPoint

Como encontrar o motorista mais próximo?

Com $nearSphere, que ordena por distância para você. Leia a posição do passageiro e consulte Driver com esse ponto — o Parse devolve as linhas já ordenadas do mais próximo ao mais distante, então não há etapa de ordenação nem cálculo de distância no seu código.

{
  "position": {
    "$nearSphere": {
      "__type": "GeoPoint",
      "latitude": 40.7291,
      "longitude": -73.9965
    }
  }
}

Para o passageiro parado em 40.7291, −73.9965, isso devolveu Nadia Okonkwo, depois Priya Raman, depois Ana Ferreira. A ordem não é óbvia a olho nu: Ana Ferreira tem longitude quase idêntica à do passageiro, o que a faz parecer a mais próxima até você levar a latitude em conta.

A resposta do banco de dados está mesmo certa?

Não confie na palavra dele. A ordenação foi recalculada a partir das mesmas coordenadas com uma fórmula de haversine simples, fora do banco de dados, e comparada.

1. Nadia Okonkwo    1.231 mi   (1.981 km)
2. Priya Raman      1.448 mi   (2.331 km)
3. Ana Ferreira     1.589 mi   (2.558 km)
4. Marcus Hale      2.078 mi   (3.344 km)
5. Tomas Vidal      4.058 mi   (6.531 km)

Mesma ordem, incluindo a troca nada óbvia. Mas bater a ordem é um teste fraco — uma ordenação pode estar certa com as distâncias erradas. Então as magnitudes também foram testadas, adicionando $maxDistanceInMiles e percorrendo o raio pelos intervalos calculados.

Raio pedidoMotoristas devolvidosEsperado pela tabela
1,2 mi0o mais próximo está a 1,231 — nenhum deveria entrar
1,3 mi1só Nadia
1,5 mi2Nadia, Priya
1,6 mi3+ Ana
2,1 mi4+ Marcus

Toda fronteira caiu exatamente onde o cálculo independente disse que cairia. O Parse não está aproximando aqui, e os números são seguros para precificar uma corrida.

Como calcular o preço da corrida?

Peça a distância entre dois pontos armazenados e multiplique. Com as posições já no banco de dados, a tarifa é uma query e uma multiplicação.

A corrida daquele passageiro até a Estátua da Liberdade mede 3,731 milhas; a um dólar por milha, sai por US$ 3,73. Isso é distância em linha reta, que é o número certo para uma demo e o número errado para uma tarifa real — a distância por ruas é maior, e qualquer precificação em produção precisa de um serviço de rotas, não de uma fórmula de grande círculo.

O banco de dados diz de bom grado a distância entre dois pontos. O que ele não diz é que ninguém consegue atravessar o rio Hudson dirigindo em linha reta.

O que precisa mudar antes de isso virar algo real?

As permissões, primeiro. Abra o Database browser e todo registro criado nesta execução mostra uma ACL de Public Read + Write — qualquer pessoa com a chave de cliente consegue ler ou sobrescrever qualquer um deles. Esse é o padrão do Parse, não uma decisão do cliente de IA, e numa classe que guarda a posição de pessoas em tempo real é exatamente o padrão errado.

As posições dos motoristas também precisam se mover. Tudo aqui é um retrato estático; um sistema de verdade atualiza o GeoPoint de um motorista continuamente e consulta o valor atual, o que muda o volume de escritas em ordens de grandeza e torna um índice no campo de posição obrigatório.

Nada disso muda o modelo, e esse é o ponto que vale levar. Três classes, um campo GeoPoint em cada uma e um operador de query que faz a geometria — a forma está certa desde o primeiro prompt, e o que sobra é o trabalho de deixá-la segura e mantê-la atualizada.

Tagsmcpgeopointgeo-queriesparse-serverdata-modelingai-agentsrest-api

Perguntas frequentes

Como encontrar o registro mais próximo de uma localização no Parse Server?

Guarde as coordenadas em um campo GeoPoint e consulte com $nearSphere. O Parse devolve os registros já ordenados do mais próximo ao mais distante, então não é preciso calcular distância nem ordenar do seu lado. Adicione $maxDistanceInMiles para cortar a query em um raio — em 23 de setembro de 2026, uma query $nearSphere com limite de 1,3 milha devolveu exatamente um motorista de cinco, e a fronteira bateu com um cálculo de haversine até a terceira casa decimal.

Um assistente de IA pode criar classes e registros no meu backend?

Sim, por meio de um servidor MCP que expõe sua conta ao assistente como ferramentas. O servidor MCP da Back4app consegue criar um app Parse, definir schemas de classe, inserir registros e rodar queries REST contra eles. Nesta execução ele criou três classes em 516 ms e inseriu 15 registros em 729 ms, tudo a partir de instruções em texto, sem chamadas de API escritas à mão.

O que aconteceu com o plugin da Back4app para o ChatGPT?

A categoria a que ele pertencia não existe mais. A OpenAI fechou a loja de plugins do ChatGPT em 19 de março de 2024 e encerrou as conversas com plugins em 9 de abril de 2024, substituindo plugins por GPTs. Guias que mandam ativar um plugin da Back4app dentro do ChatGPT não podem ser seguidos hoje. O caminho equivalente agora é o Model Context Protocol, que qualquer cliente de IA com suporte a MCP consegue usar.

Qual tipo de dado usar para coordenadas no Parse Server?

GeoPoint, não dois campos numéricos. Um GeoPoint guarda latitude e longitude como um único valor e é o que os operadores de query geoespacial leem — $nearSphere, $maxDistanceInMiles, $within. Guarde latitude e longitude em campos separados e você mantém os dados, mas perde todos esses operadores, e sobra para você calcular distâncias no código da aplicação.

Registros criados dessa forma são seguros por padrão?

Não, e vale conferir isso antes de construir em cima deles. Todo registro criado pela REST API nesta execução nasceu com uma ACL de Public Read + Write, visível no Database browser — ou seja, qualquer pessoa com a chave de cliente consegue ler ou sobrescrever todos eles. Esse é o padrão do Parse, não uma escolha do cliente de IA, e precisa ser fechado de propósito antes que qualquer parte disso chegue a usuários reais.

Leitura complementar

Revisado e verificado por Back4app Engineering, Editorial review na Back4app

Testado em 23 de setembro de 2026 — Backend: Parse Server 7.5.2, Back4app, plano Free, USA East · Cliente: servidor MCP 0.1.9 via stdio, Node 22.

Mais da Back4app Engineering

Web Deployment · tutorial

Como fazer o deploy de um site do Figma Make com um servidor MCP

Backend · tutorial

Your Frontend Talks Straight to the Database. Here Is How to Lock It Down [Full Repo]

Backend · tutorial

Build and Deploy a Node.js REST API in 15 Minutes — Without Owning a Server [Full Code Inside]