Menu Docs
Página inicial do Docs
/
MongoDB Atlas
/ / / /

GeoWithin

Nesta página

  • Definição
  • Sintaxe
  • Opções
  • Exemplos
  • box Exemplo
  • circle Exemplo
  • geometry Exemplos
geoWithin

O operador geoWithin dá suporte à query de pontos geograficamente em uma determinada modelagem. Somente os pontos são retornados, mesmo que o valor indexShapes seja true nadefinição do índice .

Você pode consultar pontos dentro de um:

  • Círculo

  • Caixa delimitadora

  • Polígono

Ao especificar as coordenadas a serem pesquisadas, a longitude deve ser especificada primeiro e depois a latitude. Os valores de longitude podem estar entre -180 e 180, ambos inclusos. Os valores de latitude podem estar entre -90 e 90, ambos inclusos. Os valores de coordenadas podem ser inteiros ou duplos.

Observação

O Atlas Search não oferece suporte ao seguinte:

  • Sistema de Referência de Coordenadas Não Padrão (CRS)

  • Sistema de coordenadas Planar XY (bidimensional)

  • Pares de coordenadas Notação de ponto (ou seja, pointFieldName: [12, 34] )

geoWithin tem a seguinte sintaxe:

{
"$search": {
"index": <index name>, // optional, defaults to "default"
"geoWithin": {
"path": "<field-to-search>",
"box | circle | geometry": <object>,
"score": <score-options>
}
}
}

geoWithin usa os seguintes termos para construir uma consulta:

Campo
Tipo
Descrição
necessidade
box
objeto

Objeto que especifica os pontos GeoJSON inferior esquerdo e superior direito de uma caixa a ser pesquisada. O objeto utiliza os seguintes campos:

Para saber como especificar dados GeoJSON em um objeto GeoJSON, consulte Objetos GeoJSON.

É necessário box , circle ou geometry .

condicional
circle
objeto

Objeto que especifica o ponto central e o raio em metros para o Atlas Search . O objeto contém os seguintes campos GeoJSON :

  • center - Centro do círculo especificado como um ponto GeoJSON.

  • radius - O raio, que é um número, especificado em metros. O valor deve ser maior ou igual a 0.

Para saber como especificar dados GeoJSON em um objeto GeoJSON, consulte Objetos GeoJSON.

É necessário circle , box ou geometry .

condicional
geometry
Objeto GeoJSON

Objeto GeoJSON que especifica o MultiPolígono ou Polígono para o Atlas Search . O polígono deve ser especificado como um loop fechado onde a última posição é igual à primeira posição.

Ao calcular os resultados geoespaciais, os operadores geoChape e geoWithin do Atlas Search e o operador $geoIntersects do MongoDB usam geometrias diferentes. Essa diferença pode ser vista na forma como o Atlas Search e o MongoDB desenham arestas poligonais.

O Atlas Search desenha polígonos com base na distância cartesiano, que é a linha mais curta entre dois pontos no sistema de referência de coordenadas.

O MongoDB desenha polígonos usando uma biblioteca de terceiros para tipos geodésicos que usam linhas geodésicas. Para saber mais, consulte Objetos GeoJSON.

Atlas Search e MongoDB podem retornar resultados diferentes para queries geoespaciais envolvendo polígonos.

Para saber como especificar dados GeoJSON em um objeto GeoJSON, consulte Objetos GeoJSON.

É necessário geometry , box ou circle .

condicional
path
cadeia de caracteres ou matriz de cadeias de caracteres
Campo ou campos de tipo geográfico indexado a serem pesquisados. Consulte Construção de caminho.
sim
score
objeto

Pontuação a ser atribuída aos resultados de pesquisa correspondentes. Por padrão, a pontuação nos resultados é 1. Você pode modificar a pontuação usando as seguintes opções:

  • boost: multiplique a pontuação do resultado pelo número fornecido.

  • constant: substitui a pontuação do resultado pelo número fornecido.

  • function: substitua a pontuação do resultado pela expressão fornecida.

Para obter informações sobre como utilizar o score em sua consulta, consulte Classificar os documentos nos resultados.

no

Os exemplos abaixo utilizam a collection listingsAndReviews no banco de dados sample_airbnb . Se você tiver o conjunto de dados de amostra no seu cluster, você poderá criar um índice de pesquisa personalizado do Atlas Search para o tipo geográfico e executar as query de exemplo no seu cluster.

Dica

Se você já carregou o conjunto de dados de amostra, siga o tutorial Iniciar com Atlas Search para criar uma definição de índice e executar queries de Atlas Search.

Você pode usar qualquer um dos seguintes conjuntos de dados de amostra para executar query de pesquisa do Atlas Search com o operador geoWithin :

Utilize a seguinte definição de índice de amostra para indexar o campo address.location na collection listingsAndReviews :

1{
2 "mappings": {
3 "fields": {
4 "address": {
5 "fields": {
6 "location": {
7 "type": "geo"
8 }
9 },
10 "type": "document"
11 }
12 }
13 }
14}

A query seguinte utiliza o operador geoWithin com o campo box para search propriedade dentro de uma caixa delimitadora na Austrália.

A consulta inclui um:

  • Estágio $limit para limitar a saída a 3 resultados.

  • Estágio $project para excluir todos os campos, exceto name e address.

Observação

Você não precisa especificar índices chamados default em sua query de pesquisa do Atlas Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index .

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoWithin": {
5 "path": "address.location",
6 "box": {
7 "bottomLeft": {
8 "type": "Point",
9 "coordinates": [112.467, -55.050]
10 },
11 "topRight": {
12 "type": "Point",
13 "coordinates": [168.000, -9.133]
14 }
15 }
16 }
17 }
18 },
19 {
20 $limit: 3
21 },
22 {
23 $project: {
24 "_id": 0,
25 "name": 1,
26 "address": 1
27 }
28 }
29])

A query retorna os seguintes resultados:

1{
2 "name" : "Surry Hills Studio - Your Perfect Base in Sydney",
3 "address" : {
4 "street" : "Surry Hills, NSW, Australia",
5 "suburb" : "Darlinghurst",
6 "government_area" : "Sydney",
7 "market" : "Sydney",
8 "country" : "Australia",
9 "country_code" : "AU",
10 "location" : {
11 "type" : "Point",
12 "coordinates" : [ 151.21554, -33.88029 ],
13 "is_location_exact" : true
14 }
15 }
16}
17{
18 "name" : "Sydney Hyde Park City Apartment (checkin from 6am)",
19 "address" : {
20 "street" : "Darlinghurst, NSW, Australia",
21 "suburb" : "Darlinghurst",
22 "government_area" : "Sydney",
23 "market" : "Sydney",
24 "country" : "Australia",
25 "country_code" : "AU",
26 "location" : {
27 "type" : "Point",
28 "coordinates" : [ 151.21346, -33.87603 ],
29 "is_location_exact" : false
30 }
31 }
32}
33{
34 "name" : "THE Place to See Sydney's FIREWORKS",
35 "address" : {
36 "street" : "Rozelle, NSW, Australia",
37 "suburb" : "Lilyfield/Rozelle",
38 "government_area" : "Leichhardt",
39 "market" : "Sydney",
40 "country" : "Australia",
41 "country_code" : "AU",
42 "location" : {
43 "type" : "Point",
44 "coordinates" : [ 151.17956, -33.86296 ],
45 "is_location_exact" : true
46 }
47 }
48}

A query seguinte utiliza o operador geoWithin com o campo circle para search propriedade dentro de um raio de uma milha de coordenadas especificadas no Canadá.

A consulta inclui um:

  • Estágio $limit para limitar a saída a 3 resultados.

  • Estágio $project para excluir todos os campos, exceto name e address.

Observação

Você não precisa especificar índices chamados default em sua query de pesquisa do Atlas Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index .

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoWithin": {
5 "circle": {
6 "center": {
7 "type": "Point",
8 "coordinates": [-73.54, 45.54]
9 },
10 "radius": 1600
11 },
12 "path": "address.location"
13 }
14 }
15 },
16 {
17 $limit: 3
18 },
19 {
20 $project: {
21 "_id": 0,
22 "name": 1,
23 "address": 1
24 }
25 }
26])

A query retorna os seguintes resultados:

1{
2 "name" : "Ligne verte - à 15 min de métro du centre ville.",
3 "address" : {
4 "street" : "Montréal, Québec, Canada",
5 "suburb" : "Hochelaga-Maisonneuve",
6 "government_area" : "Mercier-Hochelaga-Maisonneuve",
7 "market" : "Montreal",
8 "country" : "Canada",
9 "country_code" : "CA",
10 "location" : {
11 "type" : "Point",
12 "coordinates" : [ -73.54949, 45.54548 ],
13 "is_location_exact" : false
14 }
15 }
16}
17{
18 "name" : "Belle chambre à côté Metro Papineau",
19 "address" : {
20 "street" : "Montréal, QC, Canada",
21 "suburb" : "Gay Village",
22 "government_area" : "Ville-Marie",
23 "market" : "Montreal",
24 "country" : "Canada",
25 "country_code" : "CA",
26 "location" : {
27 "type" : "Point",
28 "coordinates" : [ -73.54985, 45.52797 ],
29 "is_location_exact" : false
30 }
31 }
32}
33{
34 "name" : "L'IDÉAL, ( à 2 min du métro Pie-IX ).",
35 "address" : {
36 "street" : "Montréal, Québec, Canada",
37 "suburb" : "Mercier-Hochelaga-Maisonneuve",
38 "government_area" : "Mercier-Hochelaga-Maisonneuve",
39 "market" : "Montreal",
40 "country" : "Canada",
41 "country_code" : "CA",
42 "location" : {
43 "type" : "Point",
44 "coordinates" : [ -73.55208, 45.55157 ],
45 "is_location_exact" : true
46 }
47 }
48}

Os exemplos a seguir usam o operador geoWithin com o campo geometry para pesquisar propriedades no Havaí. O campo type especifica se a área é um polígono GeoJSON ou MultiPolygon.

As queries incluem um:

  • Estágio $limit para limitar a saída a 3 resultados.

  • Estágio $project para excluir todos os campos, exceto name e address.

Observação

Você não precisa especificar índices chamados default em sua query de pesquisa do Atlas Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index .

1 db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoWithin": {
5 "geometry": {
6 "type": "Polygon",
7 "coordinates": [[[ -161.323242, 22.512557 ],
8 [ -152.446289, 22.065278 ],
9 [ -156.09375, 17.811456 ],
10 [ -161.323242, 22.512557 ]]]
11 },
12 "path": "address.location"
13 }
14 }
15 },
16 {
17 $limit: 3
18 },
19 {
20 $project: {
21 "_id": 0,
22 "name": 1,
23 "address": 1
24 }
25 }
26 ])

A query retorna os seguintes resultados:

1{
2 "name" : "Ocean View Waikiki Marina w/prkg",
3 "address" : {
4 "street" : "Honolulu, HI, United States",
5 "suburb" : "Oʻahu",
6 "government_area" : "Primary Urban Center",
7 "market" : "Oahu",
8 "country" : "United States",
9 "country_code" : "US",
10 "location" : {
11 "type" : "Point",
12 "coordinates" : [ -157.83919, 21.28634 ],
13 "is_location_exact" : true
14 }
15 }
16}
17{
18 "name" : "Kailua-Kona, Kona Coast II 2b condo",
19 "address" : {
20 "street" : "Kailua-Kona, HI, United States",
21 "suburb" : "Kailua/Kona",
22 "government_area" : "North Kona",
23 "market" : "The Big Island",
24 "country" : "United States",
25 "country_code" : "US",
26 "location" : {
27 "type" : "Point",
28 "coordinates" : [ -155.96445, 19.5702 ],
29 "is_location_exact" : true
30 }
31 }
32}
33{
34 "name" : "LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!",
35 "address" : {
36 "street" : "Lahaina, HI, United States",
37 "suburb" : "Maui",
38 "government_area" : "Lahaina",
39 "market" : "Maui",
40 "country" : "United States",
41 "country_code" : "US",
42 "location" : {
43 "type" : "Point",
44 "coordinates" : [ -156.68012, 20.96996 ],
45 "is_location_exact" : true
46 }
47 }
48}
1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoWithin": {
5 "geometry": {
6 "type": "MultiPolygon",
7 "coordinates": [
8 [[[-157.8412413882,21.2882235819],
9 [-157.8607925468,21.2962046205],
10 [-157.8646640634,21.3077019651],
11 [-157.862776699,21.320776283],
12 [-157.8341758705,21.3133826738],
13 [-157.8349985678,21.3000822569],
14 [-157.8412413882,21.2882235819]]],
15 [[[-157.852898124,21.301208833],
16 [-157.8580050499,21.3050871833],
17 [-157.8587346108,21.3098050385],
18 [-157.8508811028,21.3119240258],
19 [-157.8454308541,21.30396767],
20 [-157.852898124,21.301208833]]]
21 ]
22 },
23 "path": "address.location"
24 }
25 }
26 },
27 {
28 $limit: 3
29 },
30 {
31 $project: {
32 "_id": 0,
33 "name": 1,
34 "address": 1
35 }
36 }
37])

A query retorna os seguintes resultados:

1{
2 "name" : "Heart of Honolulu, 2BD gem! Free Garage Parking!",
3 "address" : {
4 "street" : "Honolulu, HI, United States",
5 "suburb" : "Makiki/Lower Punchbowl/Tantalus",
6 "government_area" : "Primary Urban Center",
7 "market" : "Oahu",
8 "country" : "United States",
9 "country_code" : "US",
10 "location" : {
11 "type" : "Point",
12 "coordinates" : [ -157.84343, 21.30852 ],
13 "is_location_exact" : false
14 }
15 }
16}
17{
18 "name" : "Private Studio closed to town w/ compact parking",
19 "address" : {
20 "street" : "Honolulu, HI, United States",
21 "suburb" : "Oʻahu",
22 "government_area" : "Primary Urban Center",
23 "market" : "Oahu",
24 "country" : "United States",
25 "country_code" : "US",
26 "location" : {
27 "type" : "Point",
28 "coordinates" : [ -157.85228, 21.31184 ],
29 "is_location_exact" : true
30 }
31 }
32}
33{
34 "name" : "Comfortable Room (2) at Affordable Rates",
35 "address" : {
36 "street" : "Honolulu, HI, United States",
37 "suburb" : "Oʻahu",
38 "government_area" : "Primary Urban Center",
39 "market" : "Oahu",
40 "country" : "United States",
41 "country_code" : "US",
42 "location" : {
43 "type" : "Point",
44 "coordinates" : [ -157.83889, 21.29776 ],
45 "is_location_exact" : false
46 }
47 }
48}

Voltar

geoShape