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

geoShape Operador

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

A Pesquisa do MongoDB não é compatível com o 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 MongoDB Search e o operador $geoIntersects do MongoDB utilizam geometrias diferentes. Essa diferença pode ser vista em como o MongoDB Search e o MongoDB desenham as bordas poligonais.

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

MongoDB desenha polígonos usando o modo geodésico baseado em índices2dsphere construídos sobre uma biblioteca de terceiros para tipos geodésicos, ou o modo plano, de índices2d. Para saber mais, consulte Objetos GeoJSON.

A Pesquisa do MongoDB e o 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 geo indexado para pesquisa.

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 em seu cluster, poderá criar um índice de pesquisa personalizado do MongoDB para o tipo geoespacial e executar as queries de exemplo em seu cluster. O Início rápido da pesquisa do MongoDB contém instruções para carregar o conjunto de dados de amostra, criar uma definição de índice e executar consultas da pesquisa do MongoDB.

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": "token"
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 query a seguir 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 consulta a seguir retorna o número de tipos de propriedades (como apartamento, casa e assim por diante) para os critérios de pesquisa 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.

Voltar

faceta

Nesta página