Menu Docs

geoShape

geoShape

O operador geoShape oferece suporte à query de formas relacionadas a uma determinada geometria se indexShapes for definido como true na definição do índice .

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] )

1{
2 "$search": {
3 "index": <index name>, // optional, defaults to "default"
4 "geoShape": {
5 "path": "<field-to-search>",
6 "relation": "contains | disjoint | intersects | within",
7 "geometry": <GeoJSON-object>,
8 "score": <score-options>
9 }
10 }
11}

geoShape usa os seguintes termos para construir uma consulta:

Campo
Tipo
Descrição
necessidade

geometry

Objeto GeoJSON

Objeto GeoJSON que especifica a forma Polígono, MultiPolígono ou LineString ou aponte 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 resultados geoespaciais, os operadores geoShape e geoWithin do Atlas Search e o operador $geoIntersects do MongoDB utilizam geometrias diferentes. Essa diferença pode ser vista em como o Atlas Search e o MongoDB desenham as bordas 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 o modo geodésico baseado em 2índices dsphere construídos sobre uma biblioteca de terceiros para tipos geodésicos, ou o modo plano, de 2índices d. Para saber mais, consulte Objetos GeoJSON.

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

sim

path

cadeia de caracteres ou matriz de cadeias de caracteres

campo ou campos de tipo geográfico indexados a serem pesquisados.

sim

relation

enum

Relação da geometria da forma de query com a geometria do campo indexado. O valor pode ser um dos seguintes:

  • contains - Indica que a geometria indexada contém a geometria da query.

  • disjoint - Indica que tanto a query quanto as geometrias indexadas não têm nada em comum.

  • intersects - Indica que a query e as geometrias indexadas se cruzam.

  • within - Indica que a geometria indexada está dentro da geometria da query. Você não pode usar within com LineString ou Point.

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 seguintes utilizam a coleção listingsAndReviews no banco de dados sample_airbnb. Se você tiver o conjunto de dados de amostra no seu cluster, você poderá criar um índice personalizado do Atlas Search para tipo geoespacial e executar as queries de exemplo no seu cluster. O Início Rápido do Atlas Search contém instruções para carregar o conjunto de dados de amostra, criar uma definição de índice e executar queries do Atlas Search.

O seguinte é uma 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 "indexShapes": true,
8 "type": "geo"
9 }
10 },
11 "type": "document"
12 },
13 "property_type": {
14 "type": "stringFacet"
15 }
16 }
17 }
18}

O exemplo a seguir usa o operador geoShape para pesquisar propriedade que não têm nada em comum com as coordenadas de longitude e latitude especificadas no Havaí.

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.

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoShape": {
5 "relation": "disjoint",
6 "geometry": {
7 "type": "Polygon",
8 "coordinates": [[[-161.323242,22.512557],
9 [-152.446289,22.065278],
10 [-156.09375,17.811456],
11 [-161.323242,22.512557]]]
12 },
13 "path": "address.location"
14 }
15 }
16 },
17 {
18 $limit: 3
19 },
20 {
21 $project: {
22 "_id": 0,
23 "name": 1,
24 "address": 1,
25 score: { $meta: "searchScore" }
26 }
27 }
28])
{
"name" : "Ribeira Charming Duplex",
"address" : {
"street" : "Porto, Porto, Portugal",
"suburb" : "",
"government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória",
"market" : "Porto",
"country" : "Portugal",
"country_code" : "PT",
"location" : {
"type" : "Point",
"coordinates" : [ -8.61308, 41.1413 ],
"is_location_exact" : false
}
}
}
{
"name" : "Horto flat with small garden",
"address" : {
"street" : "Rio de Janeiro, Rio de Janeiro, Brazil",
"suburb" : "Jardim Botânico",
"government_area" : "Jardim Botânico",
"market" : "Rio De Janeiro",
"country" : "Brazil",
"country_code" : "BR",
"location" : {
"type" : "Point",
"coordinates" : [ -43.23074991429229, -22.966253551739655 ],
"is_location_exact" : true
}
}
}
{
"name" : "Private Room in Bushwick",
"address" : {
"street" : "Brooklyn, NY, United States",
"suburb" : "Brooklyn",
"government_area" : "Bushwick",
"market" : "New York",
"country" : "United States",
"country_code" : "US",
"location" : {
"type" : "Point",
"coordinates" : [ -73.93615, 40.69791 ],
"is_location_exact" : true
}
}
}

O exemplo a seguir usa o operador geoShape para pesquisar propriedades que interseccionam com as coordenadas de longitude e latitude especificadas na Espanha.

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.

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoShape": {
5 "relation": "intersects",
6 "geometry": {
7 "type": "MultiPolygon",
8 "coordinates": [
9 [[[2.16942,41.40082],
10 [2.17963,41.40087],
11 [2.18146,41.39716],
12 [2.15533,41.40686],
13 [2.14596,41.38475],
14 [2.17519,41.41035],
15 [2.16942,41.40082]]],
16 [[[2.16365,41.39416],
17 [2.16963,41.39726],
18 [2.15395,41.38005],
19 [2.17935,41.43038],
20 [2.16365,41.39416]]]
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 score: { $meta: "searchScore" }
36 }
37 }
38])
{
"name" : "Cozy bedroom Sagrada Familia",
"address" : {
"street" : "Barcelona, Catalunya, Spain",
"suburb" : "Eixample",
"government_area" : "el Fort Pienc",
"market" : "Barcelona",
"country" : "Spain",
"country_code" : "ES",
"location" : {
"type" : "Point",
"coordinates" : [ 2.17963, 41.40087 ],
"is_location_exact" : true
}
}
}
{
"name" : "",
"address" : {
"street" : "Barcelona, Catalunya, Spain",
"suburb" : "Vila de Gràcia",
"government_area" : "la Vila de Gràcia",
"market" : "Barcelona",
"country" : "Spain",
"country_code" : "ES",
"location" : {
"type" : "Point",
"coordinates" : [ 2.15759, 41.40349 ],
"is_location_exact" : true
}
}
}
{
"name" : "SPACIOUS RAMBLA CATALUÑA",
"address" : {
"street" : "Barcelona, Catalunya, Spain",
"suburb" : "L'Antiga Esquerra de l'Eixample",
"government_area" : "l'Antiga Esquerra de l'Eixample",
"market" : "Barcelona",
"country" : "Spain",
"country_code" : "ES",
"location" : {
"type" : "Point",
"coordinates" : [ 2.15255, 41.39193 ],
"is_location_exact" : true
}
}
}

O exemplo a seguir usa o operador geoShape para pesquisar propriedade em Nova York que estão dentro das coordenadas de longitude e latitude especificadas. A query pesquisar o campo address.location na collection listingsAndReviews no reconhecimento de data center sample_airbnb .

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.

A seguinte query retorna os documentos que correspondem aos critérios de pesquisa especificados.

1db.listingsAndReviews.aggregate([
2 {
3 "$search": {
4 "geoShape": {
5 "relation": "within",
6 "geometry": {
7 "type": "Polygon",
8 "coordinates": [[[-74.3994140625,40.5305017757],
9 [-74.7290039063,40.5805846641],
10 [-74.7729492188,40.9467136651],
11 [-74.0698242188,41.1290213475],
12 [-73.65234375,40.9964840144],
13 [-72.6416015625,40.9467136651],
14 [-72.3559570313,40.7971774152],
15 [-74.3994140625,40.5305017757]]]
16 },
17 "path": "address.location"
18 }
19 }
20 },
21 {
22 $limit: 3
23 },
24 {
25 $project: {
26 "_id": 0,
27 "name": 1,
28 "address": 1,
29 score: { $meta: "searchScore" }
30 }
31 }
32])
{
"name" : "Private Room in Bushwick",
"address" : {
"street" : "Brooklyn, NY, United States",
"suburb" : "Brooklyn",
"government_area" : "Bushwick",
"market" : "New York",
"country" : "United States",
"country_code" : "US",
"location" : {
"type" : "Point",
"coordinates" : [ -73.93615, 40.69791 ],
"is_location_exact" : true
}
},
{
"name" : "New York City - Upper West Side Apt",
"address" : {
"street" : "New York, NY, United States",
"suburb" : "Manhattan",
"government_area" : "Upper West Side",
"market" : "New York",
"country" : "United States",
"country_code" : "US",
"location" : {
"type" : "Point",
"coordinates" : [ -73.96523, 40.79962 ],
"is_location_exact" : false
}
},
"score" : 1
}
{
"name" : "Deluxe Loft Suite",
"address" : {
"street" : "Brooklyn, NY, United States",
"suburb" : "Greenpoint",
"government_area" : "Greenpoint",
"market" : "New York",
"country" : "United States",
"country_code" : "US",
"location" : {
"type" : "Point",
"coordinates" : [ -73.94472, 40.72778 ],
"is_location_exact" : true
}
},
"score" : 1
}

A query abaixo retorna o número de tipos de propriedades (como apartamento, casa e assim por diante) para os critérios de query especificados.

1db.listingsAndReviews.aggregate([
2 {
3 "$searchMeta": {
4 "facet": {
5 "operator": {
6 "geoShape": {
7 "relation": "within",
8 "geometry": {
9 "type": "Polygon",
10 "coordinates": [[[-74.3994140625,40.5305017757],
11 [-74.7290039063,40.5805846641],
12 [-74.7729492188,40.9467136651],
13 [-74.0698242188,41.1290213475],
14 [-73.65234375,40.9964840144],
15 [-72.6416015625,40.9467136651],
16 [-72.3559570313,40.7971774152],
17 [-74.3994140625,40.5305017757]]]
18 },
19 "path": "address.location"
20 }
21 },
22 "facets": {
23 "propertyTypeFacet": {
24 "type": "string",
25 "path": "property_type"
26 }
27 }
28 }
29 }
30 }
31])
[
{
count: { lowerBound: Long('599') },
facet: {
propertyTypeFacet: {
buckets: [
{ _id: 'Apartment', count: Long('486') },
{ _id: 'House', count: Long('43') },
{ _id: 'Townhouse', count: Long('24') },
{ _id: 'Condominium', count: Long('19') },
{ _id: 'Loft', count: Long('19') },
{ _id: 'Guest suite', count: Long('2') },
{ _id: 'Guesthouse', count: Long('2') },
{ _id: 'Aparthotel', count: Long('1') },
{ _id: 'Hostel', count: Long('1') },
{ _id: 'Serviced apartment', count: Long('1') }
]
}
}
}
]

Os resultados da query mostram os diferentes tipos de propriedades nas coordenadas especificadas.