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

geoWithin Operador

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

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

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 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.

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 geo indexado para pesquisa.

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.

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 "property_type": {
13 "type": "token"
14 }
15 }
16 }
17}

➤ Use o menu suspenso Selecione seu idioma nesta página para definir o idioma dos exemplos nesta seção.


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 denominados default em sua query do MongoDB Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index.

A query do MongoDB Search a seguir retorna os documentos que correspondem aos critérios de pesquisa especificados.

{
"$search": {
"geoWithin": {
"path": "address.location",
"box": {
"bottomLeft": {
"type": "Point",
"coordinates": [112.467, -55.050]
},
"topRight": {
"type": "Point",
"coordinates": [168.000, -9.133]
}
}
}
}
}
1SCORE: 1 _id: “10091713
2 access: "You have full use of the entire studio and complete privacy during you…"
3 accommodates: 2
4 address: Object
5 street: "Surry Hills, NSW, Australia"
6 suburb: "Darlinghurst"
7 government_area: "Sydney"
8 market: "Sydney"
9 country: "Australia"
10 country_code: "AU"
11 location: Object
12 type: "Point"
13 coordinates: Array (2)
14 0: 151.21554
15 1: -33.88029
16 is_location_exact: true
17
18SCORE: 1 _id: “10108388
19 access: "SECURITY Secure 24hour front-desk access with full access to the roof…"
20 accommodates: 2
21 address: Object
22 street: "Darlinghurst, NSW, Australia"
23 suburb: "Darlinghurst"
24 government_area: "Sydney"
25 market: "Sydney"
26 country: "Australia"
27 country_code: "AU"
28 location: Object
29 type: "Point"
30 coordinates: Array (2)
31 0: 151.21346
32 1: -33.87603
33 is_location_exact: false
34
35SCORE: 1 _id: “10109896
36 access: "You'll access all areas except the master bedroom and spare bedrooms, …"
37 accommodates: 2
38 address: Object
39 street: "Rozelle, NSW, Australia"
40 suburb: "Lilyfield/Rozelle"
41 government_area: "Leichhardt"
42 market: "Sydney"
43 country: "Australia"
44 country_code: "AU"
45 location: Object
46 type: "Point"
47 coordinates: Array (2)
48 0: 151.17956
49 1: -33.86296
50 is_location_exact: true
51
52SCORE: 1 _id: “1016739
53 access: "Included in the price is unlimited wifi, Kitchen facilities, Laundry f…"
54 accommodates: 2
55 address: Object
56 street: "Coogee, NSW, Australia"
57 suburb: "Coogee"
58 government_area: "Randwick"
59 market: "Sydney"
60 country: "Australia"
61 country_code: "AU"
62 location: Object
63 type: "Point"
64 coordinates: Array (2)
65 0: 151.25541
66 1: -33.92398
67 is_location_exact: true
68
69SCORE: 1 _id: “10209136
70 access: "You will have access to kitchen, bathroom, lounge room, separate laund…"
71 accommodates: 2
72 address: Object
73 street: "Fairlight, NSW, Australia"
74 suburb: "Fairlight"
75 government_area: "Manly"
76 market: "Sydney"
77 country: "Australia"
78 country_code: "AU"
79 location: Object
80 type: "Point"
81 coordinates: Array (2)
82 0: 151.26969
83 1: -33.79629
84 is_location_exact: false
85
86SCORE: 1 _id: “10213499
87 access: "Guests have access to backyard saltwater pool"
88 accommodates: 2
89 address: Object
90 street: "Narrabeen, NSW, Australia"
91 suburb: ""
92 government_area: "Warringah"
93 market: "Sydney"
94 country: "Australia"
95 country_code: "AU"
96 location: Object
97 type: "Point"
98 coordinates: Array (2)
99 0: 151.29792
100 1: -33.71472
101 is_location_exact: true
102
103SCORE: 1 _id: “10416859
104 access: "There is a private, external entrance to your room. And there are sta…"
105 accommodates: 5
106 address: Object
107 street: "Balgowlah, NSW, Australia"
108 suburb: "Balgowlah"
109 government_area: "Manly"
110 market: "Sydney"
111 country: "Australia"
112 country_code: "AU"
113 location: Object
114 type: "Point"
115 coordinates: Array (2)
116 0: 151.26108
117 1: -33.7975
118 is_location_exact: true
119
120SCORE: 1 _id: “10423504
121 access: "The house has a front deck and back garden area. I can be flexible wi…"
122 accommodates: 8
123 address: Object
124 street: "Bondi Beach, NSW, Australia"
125 suburb: "Bondi Beach"
126 government_area: "Waverley"
127 market: "Sydney"
128 country: "Australia"
129 country_code: "AU"
130 location: Object
131 type: "Point"
132 coordinates: Array (2)
133 0: 151.27448
134 1: -33.8872
135 is_location_exact: false
136
137SCORE: 1 _id: “10459480
138 access: "Complete home."
139 accommodates: 6
140 address: Object
141 street: "Greenwich, NSW, Australia"
142 suburb: "Greenwich"
143 government_area: "Lane Cove"
144 market: "Sydney"
145 country: "Australia"
146 country_code: "AU"
147 location: Object
148 type: "Point"
149 coordinates: Array (2)
150 0: 151.18563
151 1: -33.8289
152 is_location_exact: true
153
154SCORE: 1 _id: “1047087
155 access: "Guests come in to the studio using their own access via a side path. G…"
156 accommodates: 2
157 address: Object
158 street: "Marrickville, NSW, Australia"
159 suburb: "Marrickville"
160 government_area: "Marrickville"
161 market: "Sydney"
162 country: "Australia"
163 country_code: "AU"
164 location: Object
165 type: "Point"
166 coordinates: Array (2)
167 0: 151.15036
168 1: -33.90318
169 is_location_exact: false
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])
[
{
name: 'Surry Hills Studio - Your Perfect Base in Sydney',
address: {
street: 'Surry Hills, NSW, Australia',
suburb: 'Darlinghurst',
government_area: 'Sydney',
market: 'Sydney',
country: 'Australia',
country_code: 'AU',
location: {
type: 'Point',
coordinates: [ 151.21554, -33.88029 ],
is_location_exact: true
}
}
},
{
name: 'Sydney Hyde Park City Apartment (checkin from 6am)',
address: {
street: 'Darlinghurst, NSW, Australia',
suburb: 'Darlinghurst',
government_area: 'Sydney',
market: 'Sydney',
country: 'Australia',
country_code: 'AU',
location: {
type: 'Point',
coordinates: [ 151.21346, -33.87603 ],
is_location_exact: false
}
}
},
{
name: "THE Place to See Sydney's FIREWORKS",
address: {
street: 'Rozelle, NSW, Australia',
suburb: 'Lilyfield/Rozelle',
government_area: 'Leichhardt',
market: 'Sydney',
country: 'Australia',
country_code: 'AU',
location: {
type: 'Point',
coordinates: [ 151.17956, -33.86296 ],
is_location_exact: true
}
}
}
]

Para aprender como executar as seguintes queries no MongoDB Compass, consulte Definir sua query.

estágio do pipeline
Query

$search

{
"geoWithin": {
"path": "address.location",
"box": {
"bottomLeft": {
"type": "Point",
"coordinates": [112.467, -55.050]
},
"topRight": {
"type": "Point",
"coordinates": [168.000, -9.133]
}
}
}
}

$limit

3

$project

{
"_id": 0,
"name": 1,
"address": 1
}
{
"name" : "Surry Hills Studio - Your Perfect Base in Sydney",
"address" : {
"street" : "Surry Hills, NSW, Australia",
"suburb" : "Darlinghurst",
"government_area" : "Sydney",
"market" : "Sydney",
"country" : "Australia",
"country_code" : "AU",
"location" : {
"type" : "Point",
"coordinates" : [ 151.21554, -33.88029 ],
"is_location_exact" : true
}
}
}
{
"name" : "Sydney Hyde Park City Apartment (checkin from 6am)",
"address" : {
"street" : "Darlinghurst, NSW, Australia",
"suburb" : "Darlinghurst",
"government_area" : "Sydney",
"market" : "Sydney",
"country" : "Australia",
"country_code" : "AU",
"location" : {
"type" : "Point",
"coordinates" : [ 151.21346, -33.87603 ],
"is_location_exact" : false
}
}
}
{
"name" : "THE Place to See Sydney's FIREWORKS",
"address" : {
"street" : "Rozelle, NSW, Australia",
"suburb" : "Lilyfield/Rozelle",
"government_area" : "Leichhardt",
"market" : "Sydney",
"country" : "Australia",
"country_code" : "AU",
"location" : {
"type" : "Point",
"coordinates" : [ 151.17956, -33.86296 ],
"is_location_exact" : true
}
}
}
1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.GeoJsonObjectModel;
6using MongoDB.Driver.Search;
7
8public class GeoBoxQuery
9{
10 // Make sure your password is URL encoded if it contains special characters
11 // Replace with your actual connection string with correct credentials
12 private const string MongoConnectionString = "<connection-string>";
13
14 public static void Main(string[] args)
15 {
16 // allow automapping of the camelCase database fields to our PropertyDocument
17 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
18 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
19
20 // connect to your Atlas cluster
21 var mongoClient = new MongoClient(MongoConnectionString);
22 var airbnbDatabase = mongoClient.GetDatabase("sample_airbnb");
23 var listingsCollection = airbnbDatabase.GetCollection<PropertyDocument>("listingsAndReviews");
24
25 // define and run pipeline
26 var results = listingsCollection.Aggregate()
27 .Search(Builders<PropertyDocument>.Search.GeoWithin(
28 property => property.Address!.Location,
29 new GeoWithinBox<GeoJson2DCoordinates>(
30 new GeoJsonPoint<GeoJson2DCoordinates>(new GeoJson2DCoordinates(112.467, -55.050)),
31 new GeoJsonPoint<GeoJson2DCoordinates>(new GeoJson2DCoordinates(168.000, -9.133))
32 )
33 ))
34 .Limit(3)
35 .Project<PropertyDocument>(Builders<PropertyDocument>.Projection
36 .Include(property => property.Name)
37 .Include(property => property.Address)
38 .Exclude(property => property.Id))
39 .ToList();
40
41 // print results
42 foreach (var property in results)
43 {
44 Console.WriteLine(property.ToJson());
45 }
46 }
47}
48
49[BsonIgnoreExtraElements]
50public class PropertyDocument
51{
52 [BsonIgnoreIfDefault]
53 public ObjectId Id { get; set; }
54 public string? Name { get; set; }
55 public AddressDocument? Address { get; set; }
56}
57
58[BsonIgnoreExtraElements]
59public class AddressDocument
60{
61 public GeoJsonPoint<GeoJson2DCoordinates>? Location { get; set; }
62 public string? Street { get; set; }
63 public string? Country { get; set; }
64}
{ "name" : "Surry Hills Studio - Your Perfect Base in Sydney", "address" : { "location" : { "type" : "Point", "coordinates" : [151.21554, -33.880290000000002], "is_location_exact" : true }, "street" : "Surry Hills, NSW, Australia", "country" : "Australia" } }
{ "name" : "Sydney Hyde Park City Apartment (checkin from 6am)", "address" : { "location" : { "type" : "Point", "coordinates" : [151.21346, -33.87603], "is_location_exact" : false }, "street" : "Darlinghurst, NSW, Australia", "country" : "Australia" } }
{ "name" : "THE Place to See Sydney's FIREWORKS", "address" : { "location" : { "type" : "Point", "coordinates" : [151.17956000000001, -33.862960000000001], "is_location_exact" : true }, "street" : "Rozelle, NSW, Australia", "country" : "Australia" } }
1package main
2
3import (
4 "context"
5 "fmt"
6 "time"
7
8 "go.mongodb.org/mongo-driver/v2/bson"
9 "go.mongodb.org/mongo-driver/v2/mongo"
10 "go.mongodb.org/mongo-driver/v2/mongo/options"
11)
12
13// define structure of listingsAndReviews collection
14type Property struct {
15 Name string `bson:"name"`
16 Address struct {
17 Location struct {
18 Type string `bson:"type"`
19 Coordinates []float64 `bson:"coordinates"`
20 } `bson:"location"`
21 Street string `bson:"street"`
22 Country string `bson:"country"`
23 } `bson:"address"`
24}
25
26func main() {
27 var err error
28 // connect to the Atlas cluster
29 ctx := context.Background()
30 client, err := mongo.Connect(options.Client().SetTimeout(5*time.Second).ApplyURI("<connection-string>"))
31 if err != nil {
32 panic(err)
33 }
34 defer client.Disconnect(ctx)
35 // set namespace
36 collection := client.Database("sample_airbnb").Collection("listingsAndReviews")
37 // define pipeline
38 searchStage := bson.D{{Key: "$search", Value: bson.M{
39 "geoWithin": bson.M{
40 "path": "address.location",
41 "box": bson.M{
42 "bottomLeft": bson.M{
43 "type": "Point",
44 "coordinates": []float64{112.467, -55.050},
45 },
46 "topRight": bson.M{
47 "type": "Point",
48 "coordinates": []float64{168.000, -9.133},
49 },
50 },
51 },
52 }}}
53 limitStage := bson.D{{Key: "$limit", Value: 3}}
54 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "_id", Value: 0}, {Key: "name", Value: 1}, {Key: "address", Value: 1}}}}
55 // run pipeline
56 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
57 if err != nil {
58 panic(err)
59 }
60 // print results
61 var results []Property
62 if err = cursor.All(context.TODO(), &results); err != nil {
63 panic(err)
64 }
65 for _, result := range results {
66 fmt.Println(result)
67 }
68}
{Surry Hills Studio - Your Perfect Base in Sydney {{Point [151.21554 -33.88029]} Surry Hills, NSW, Australia Australia}}
{Sydney Hyde Park City Apartment (checkin from 6am) {{Point [151.21346 -33.87603]} Darlinghurst, NSW, Australia Australia}}
{THE Place to See Sydney's FIREWORKS {{Point [151.17956 -33.86296]} Rozelle, NSW, Australia Australia}}
1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.excludeId;
5import static com.mongodb.client.model.Projections.fields;
6import static com.mongodb.client.model.Projections.include;
7import com.mongodb.client.MongoClient;
8import com.mongodb.client.MongoClients;
9import com.mongodb.client.MongoCollection;
10import com.mongodb.client.MongoDatabase;
11import org.bson.Document;
12
13public class GeoBoxQuery {
14 public static void main( String[] args ) {
15
16 // define query
17 Document agg = new Document("$search",
18 new Document("geoWithin",
19 new Document("path", "address.location")
20 .append("box",
21 new Document("bottomLeft",
22 new Document("type", "Point")
23 .append("coordinates", Arrays.asList(112.467, -55.050)))
24 .append("topRight",
25 new Document("type", "Point")
26 .append("coordinates", Arrays.asList(168.000, -9.133))))));
27
28 // specify connection
29 String uri = "<connection-string>";
30
31 // establish connection and set namespace
32 try (MongoClient mongoClient = MongoClients.create(uri)) {
33 MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
34 MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
35 // run query and print results
36 collection.aggregate(Arrays.asList(agg,
37 limit(3),
38 project(fields(excludeId(), include("name", "address")))))
39 .forEach(doc -> System.out.println(doc.toJson()));
40 }
41 }
42}
{
"name" : "Surry Hills Studio - Your Perfect Base in Sydney",
"address" : {
"street" : "Surry Hills, NSW, Australia",
"suburb" : "Darlinghurst",
"government_area" : "Sydney",
"market" : "Sydney",
"country" : "Australia",
"country_code" : "AU",
"location" : {
"type" : "Point",
"coordinates" : [ 151.21554, -33.88029 ],
"is_location_exact" : true
}
}
}
{
"name" : "Sydney Hyde Park City Apartment (checkin from 6am)",
"address" : {
"street" : "Darlinghurst, NSW, Australia",
"suburb" : "Darlinghurst",
"government_area" : "Sydney",
"market" : "Sydney",
"country" : "Australia",
"country_code" : "AU",
"location" : {
"type" : "Point",
"coordinates" : [ 151.21346, -33.87603 ],
"is_location_exact" : false
}
}
}
{
"name" : "THE Place to See Sydney's FIREWORKS",
"address" : {
"street" : "Rozelle, NSW, Australia",
"suburb" : "Lilyfield/Rozelle",
"government_area" : "Leichhardt",
"market" : "Sydney",
"country" : "Australia",
"country_code" : "AU",
"location" : {
"type" : "Point",
"coordinates" : [ 151.17956, -33.86296 ],
"is_location_exact" : true
}
}
}
1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_airbnb")
13 val collection = database.getCollection<Document>("listingsAndReviews")
14
15 runBlocking {
16 // define query
17 val agg = Document(
18 "\$search",
19 Document("geoWithin",
20 Document("path", "address.location")
21 .append("box",
22 Document("bottomLeft",
23 Document("type", "Point")
24 .append("coordinates", listOf(112.467, -55.050)))
25 .append("topRight",
26 Document("type", "Point")
27 .append("coordinates", listOf(168.000, -9.133)))))
28 )
29
30 // run query and print results
31 val resultsFlow = collection.aggregate<Document>(
32 listOf(
33 agg,
34 limit(3),
35 project(fields(excludeId(), include("name", "address")))
36 )
37 )
38 resultsFlow.collect { println(it) }
39 }
40 mongoClient.close()
41}
Document{{name=Surry Hills Studio - Your Perfect Base in Sydney, address=Document{{street=Surry Hills, NSW, Australia, suburb=Darlinghurst, government_area=Sydney, market=Sydney, country=Australia, country_code=AU, location=Document{{type=Point, coordinates=[151.21554, -33.88029], is_location_exact=true}}}}}}
Document{{name=Sydney Hyde Park City Apartment (checkin from 6am), address=Document{{street=Darlinghurst, NSW, Australia, suburb=Darlinghurst, government_area=Sydney, market=Sydney, country=Australia, country_code=AU, location=Document{{type=Point, coordinates=[151.21346, -33.87603], is_location_exact=false}}}}}}
Document{{name=THE Place to See Sydney's FIREWORKS, address=Document{{street=Rozelle, NSW, Australia, suburb=Lilyfield/Rozelle, government_area=Leichhardt, market=Sydney, country=Australia, country_code=AU, location=Document{{type=Point, coordinates=[151.17956, -33.86296], is_location_exact=true}}}}}}
1const { MongoClient } = require("mongodb");
2
3// connect to your Atlas cluster
4const uri = "<connection-string>";
5
6const client = new MongoClient(uri);
7
8async function run() {
9 try {
10 await client.connect();
11
12 // set namespace
13 const database = client.db("sample_airbnb");
14 const coll = database.collection("listingsAndReviews");
15
16 // define pipeline
17 const agg = [
18 {
19 '$search': {
20 'geoWithin': {
21 'path': 'address.location',
22 'box': {
23 'bottomLeft': {
24 'type': 'Point',
25 'coordinates': [112.467, -55.050]
26 },
27 'topRight': {
28 'type': 'Point',
29 'coordinates': [168.000, -9.133]
30 }
31 }
32 }
33 }
34 }, {
35 '$limit': 3
36 }, {
37 '$project': {
38 '_id': 0,
39 'name': 1,
40 'address': 1
41 }
42 }
43 ];
44
45 // run pipeline
46 const result = coll.aggregate(agg);
47
48 // print results
49 await result.forEach((doc) => console.log(doc));
50 } finally {
51 await client.close();
52 }
53}
54run().catch(console.dir);
{
name: 'Surry Hills Studio - Your Perfect Base in Sydney',
address: {
street: 'Surry Hills, NSW, Australia',
suburb: 'Darlinghurst',
government_area: 'Sydney',
market: 'Sydney',
country: 'Australia',
country_code: 'AU',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
}
}
{
name: 'Sydney Hyde Park City Apartment (checkin from 6am)',
address: {
street: 'Darlinghurst, NSW, Australia',
suburb: 'Darlinghurst',
government_area: 'Sydney',
market: 'Sydney',
country: 'Australia',
country_code: 'AU',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
}
}
{
name: "THE Place to See Sydney's FIREWORKS",
address: {
street: 'Rozelle, NSW, Australia',
suburb: 'Lilyfield/Rozelle',
government_area: 'Leichhardt',
market: 'Sydney',
country: 'Australia',
country_code: 'AU',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
}
}
1import pymongo
2import dns.resolver
3
4# connect to your Atlas cluster
5client = pymongo.MongoClient("<connection-string>")
6
7# define pipeline
8pipeline = [
9 {
10 "$search": {
11 "geoWithin": {
12 "path": "address.location",
13 "box": {
14 "bottomLeft": {
15 "type": "Point",
16 "coordinates": [112.467, -55.050]
17 },
18 "topRight": {
19 "type": "Point",
20 "coordinates": [168.000, -9.133]
21 }
22 }
23 }
24 }
25 },
26 {
27 "$limit": 3
28 },
29 {
30 "$project": {
31 "_id": 0,
32 "name": 1,
33 "address": 1
34 }
35 }
36]
37
38# run pipeline
39result = client.sample_airbnb.listingsAndReviews.aggregate(pipeline)
40
41# print results
42for i in result:
43 print(i)
{'name': 'Surry Hills Studio - Your Perfect Base in Sydney', 'address': {'street': 'Surry Hills, NSW, Australia', 'suburb': 'Darlinghurst', 'government_area': 'Sydney', 'market': 'Sydney', 'country': 'Australia', 'country_code': 'AU', 'location': {'type': 'Point', 'coordinates': [151.21554, -33.88029], 'is_location_exact': True}}}
{'name': 'Sydney Hyde Park City Apartment (checkin from 6am)', 'address': {'street': 'Darlinghurst, NSW, Australia', 'suburb': 'Darlinghurst', 'government_area': 'Sydney', 'market': 'Sydney', 'country': 'Australia', 'country_code': 'AU', 'location': {'type': 'Point', 'coordinates': [151.21346, -33.87603], 'is_location_exact': False}}}
{'name': "THE Place to See Sydney's FIREWORKS", 'address': {'street': 'Rozelle, NSW, Australia', 'suburb': 'Lilyfield/Rozelle', 'government_area': 'Leichhardt', 'market': 'Sydney', 'country': 'Australia', 'country_code': 'AU', 'location': {'type': 'Point', 'coordinates': [151.17956, -33.86296], 'is_location_exact': True}}}

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.

{
"$searchMeta": {
"facet": {
"operator": {
"geoWithin": {
"path": "address.location",
"box": {
"bottomLeft": {
"type": "Point",
"coordinates": [112.467, -55.050]
},
"topRight": {
"type": "Point",
"coordinates": [168.000, -9.133]
}
}
}
},
"facets": {
"propertyTypeFacet": {
"type": "string",
"path": "property_type"
}
}
}
}
}
1map[
2 count:map[lowerBound:610]
3 facet:map[
4 propertyTypeFacet:map[
5 buckets:[
6 map[_id:Apartment count:334]
7 map[_id:House count:168]
8 map[_id:Townhouse count:29]
9 map[_id:Guest suite count:20]
10 map[_id:Condominium count:11]
11 map[_id:Cabin count:8]
12 map[_id:Serviced apartment count:7]
13 map[_id:Villa count:7]
14 map[_id:Bungalow count:5]
15 map[_id:Guesthouse count:5]
16 ]
17 ]
18 ]
19]
1db.listingsAndReviews.aggregate([
2 {
3 "$searchMeta": {
4 "facet": {
5 "operator": {
6 "geoWithin": {
7 "path": "address.location",
8 "box": {
9 "bottomLeft": {
10 "type": "Point",
11 "coordinates": [112.467, -55.050]
12 },
13 "topRight": {
14 "type": "Point",
15 "coordinates": [168.000, -9.133]
16 }
17 }
18 }
19 },
20 "facets": {
21 "propertyTypeFacet": {
22 "type": "string",
23 "path": "property_type"
24 }
25 }
26 }
27 }
28 }
29])
map[
count:map[lowerBound:610]
facet:map[
propertyTypeFacet:map[
buckets:[
map[_id:Apartment count:334]
map[_id:House count:168]
map[_id:Townhouse count:29]
map[_id:Guest suite count:20]
map[_id:Condominium count:11]
map[_id:Cabin count:8]
map[_id:Serviced apartment count:7]
map[_id:Villa count:7]
map[_id:Bungalow count:5]
map[_id:Guesthouse count:5]
]
]
]
]

Para aprender como executar as seguintes queries no MongoDB Compass, consulte Definir sua query.

Para executar esta consulta no MongoDB Compass:

  1. Clique na aba Aggregations.

  2. Clique em Select... e, em seguida, configure o seguinte estágio do pipeline, selecionando o estágio no menu suspenso e adicionando a consulta para esse estágio.

    estágio do pipeline
    Query

    $searchMeta

    {
    "facet": {
    "operator": {
    "geoWithin": {
    "path": "address.location",
    "box": {
    "bottomLeft": {
    "type": "Point",
    "coordinates": [112.467, -55.050]
    },
    "topRight": {
    "type": "Point",
    "coordinates": [168.000, -9.133]
    }
    }
    }
    },
    "facets": {
    "propertyTypeFacet": {
    "type": "string",
    "path": "property_type"
    }
    }
    }
    }
map[
count:map[lowerBound:610]
facet:map[
propertyTypeFacet:map[
buckets:[
map[_id:Apartment count:334]
map[_id:House count:168]
map[_id:Townhouse count:29]
map[_id:Guest suite count:20]
map[_id:Condominium count:11]
map[_id:Cabin count:8]
map[_id:Serviced apartment count:7]
map[_id:Villa count:7]
map[_id:Bungalow count:5]
map[_id:Guesthouse count:5]
]
]
]
]
1// establish connection and set namespace
2using MongoDB.Bson;
3using MongoDB.Driver;
4
5var client = new MongoClient("<connection-string>");
6var database = client.GetDatabase("sample_airbnb");
7var collection = database.GetCollection<BsonDocument>("listingsAndReviews");
8
9// define query
10var agg = new BsonDocument("$searchMeta",
11 new BsonDocument("facet",
12 new BsonDocument
13 {
14 ["operator"] = new BsonDocument("geoWithin",
15 new BsonDocument
16 {
17 ["path"] = "address.location",
18 ["box"] = new BsonDocument
19 {
20 ["bottomLeft"] = new BsonDocument
21 {
22 ["type"] = "Point",
23 ["coordinates"] = new BsonArray { 112.467, -55.050 }
24 },
25 ["topRight"] = new BsonDocument
26 {
27 ["type"] = "Point",
28 ["coordinates"] = new BsonArray { 168.000, -9.133 }
29 }
30 }
31 }),
32 ["facets"] = new BsonDocument("propertyTypeFacet",
33 new BsonDocument
34 {
35 ["type"] = "string",
36 ["path"] = "property_type"
37 })
38 }));
39
40// run query and print results
41var cursor = collection.Aggregate<BsonDocument>(
42 new BsonDocument[] { agg }
43);
44foreach (var result in cursor.ToEnumerable())
45{
46 Console.WriteLine(result);
47}
map[
count:map[lowerBound:610]
facet:map[
propertyTypeFacet:map[
buckets:[
map[_id:Apartment count:334]
map[_id:House count:168]
map[_id:Townhouse count:29]
map[_id:Guest suite count:20]
map[_id:Condominium count:11]
map[_id:Cabin count:8]
map[_id:Serviced apartment count:7]
map[_id:Villa count:7]
map[_id:Bungalow count:5]
map[_id:Guesthouse count:5]
]
]
]
]
1// run-geo-box-metadata-query.go
2
3package main
4
5import (
6 "context"
7 "fmt"
8 "log"
9
10 "go.mongodb.org/mongo-driver/bson"
11 "go.mongodb.org/mongo-driver/mongo"
12 "go.mongodb.org/mongo-driver/mongo/options"
13)
14
15func main() {
16 // establish connection and set namespace
17 client, err := mongo.Connect(context.TODO(),
18 options.Client().ApplyURI("<connection-string>"))
19 if err != nil {
20 log.Fatal(err)
21 }
22 defer client.Disconnect(context.TODO())
23
24 collection := client.Database("sample_airbnb").Collection("listingsAndReviews")
25
26 // define query
27 searchStage := bson.D{{"$searchMeta", bson.D{
28 {"facet", bson.D{
29 {"operator", bson.D{
30 {"geoWithin", bson.D{
31 {"path", "address.location"},
32 {"box", bson.D{
33 {"bottomLeft", bson.D{
34 {"type", "Point"},
35 {"coordinates", bson.A{112.467, -55.050}},
36 }},
37 {"topRight", bson.D{
38 {"type", "Point"},
39 {"coordinates", bson.A{168.000, -9.133}},
40 }},
41 }},
42 }},
43 }},
44 {"facets", bson.D{
45 {"propertyTypeFacet", bson.D{
46 {"type", "string"},
47 {"path", "property_type"},
48 }},
49 }},
50 }},
51 }}}
52
53 // run query and print results
54 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage})
55 if err != nil {
56 log.Fatal(err)
57 }
58 defer cursor.Close(context.TODO())
59
60 for cursor.Next(context.TODO()) {
61 var result bson.M
62 if err := cursor.Decode(&result); err != nil {
63 log.Fatal(err)
64 }
65 fmt.Println(result)
66 }
67}
map[
count:map[lowerBound:610]
facet:map[
propertyTypeFacet:map[
buckets:[
map[_id:Apartment count:334]
map[_id:House count:168]
map[_id:Townhouse count:29]
map[_id:Guest suite count:20]
map[_id:Condominium count:11]
map[_id:Cabin count:8]
map[_id:Serviced apartment count:7]
map[_id:Villa count:7]
map[_id:Bungalow count:5]
map[_id:Guesthouse count:5]
]
]
]
]
1import org.bson.Document;
2import com.mongodb.client.MongoClient;
3import com.mongodb.client.MongoClients;
4import com.mongodb.client.MongoCollection;
5import com.mongodb.client.MongoDatabase;
6import java.util.Arrays;
7
8public class GeoBoxMetadataQuery {
9 public static void main(String[] args) {
10 // establish connection and set namespace
11 String uri = "<connection-string>";
12
13 try (MongoClient mongoClient = MongoClients.create(uri)) {
14 MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
15 MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
16
17 // define query
18 Document agg = new Document("$searchMeta",
19 new Document("facet",
20 new Document()
21 .append("operator", new Document("geoWithin",
22 new Document()
23 .append("path", "address.location")
24 .append("box", new Document()
25 .append("bottomLeft", new Document()
26 .append("type", "Point")
27 .append("coordinates", Arrays.asList(112.467, -55.050)))
28 .append("topRight", new Document()
29 .append("type", "Point")
30 .append("coordinates", Arrays.asList(168.000, -9.133))))))
31 .append("facets", new Document("propertyTypeFacet",
32 new Document()
33 .append("type", "string")
34 .append("path", "property_type")))));
35
36 // run query and print results
37 collection.aggregate(Arrays.asList(agg))
38 .forEach(doc -> System.out.println(doc.toJson()));
39 }
40 }
41}
map[
count:map[lowerBound:610]
facet:map[
propertyTypeFacet:map[
buckets:[
map[_id:Apartment count:334]
map[_id:House count:168]
map[_id:Townhouse count:29]
map[_id:Guest suite count:20]
map[_id:Condominium count:11]
map[_id:Cabin count:8]
map[_id:Serviced apartment count:7]
map[_id:Villa count:7]
map[_id:Bungalow count:5]
map[_id:Guesthouse count:5]
]
]
]
]
1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_airbnb")
13 val collection = database.getCollection<Document>("listingsAndReviews")
14
15 runBlocking {
16 // define query
17 val agg = Document(
18 "\$searchMeta",
19 Document("facet",
20 Document("operator",
21 Document("geoWithin",
22 Document("path", "address.location")
23 .append("box",
24 Document("bottomLeft",
25 Document("type", "Point")
26 .append("coordinates", listOf(112.467, -55.050)))
27 .append("topRight",
28 Document("type", "Point")
29 .append("coordinates", listOf(168.000, -9.133))))))
30 .append("facets",
31 Document("propertyTypeFacet",
32 Document("type", "string")
33 .append("path", "property_type"))))
34 )
35
36 // run query and print results
37 val resultsFlow = collection.aggregate<Document>(listOf(agg))
38 resultsFlow.collect { println(it) }
39 }
40 mongoClient.close()
41}
Document{
{count=Document{{lowerBound=610}},
facet=Document{
{propertyTypeFacet=Document{
{buckets=[Document{
{_id=Apartment, count=334}
},
Document{
{_id=House, count=168}},
Document{
{_id=Townhouse, count=29}},
Document{
{_id=Guest suite, count=20}
},
Document{
{_id=Condominium, count=11}
},
Document{
{_id=Cabin, count=8}
},
Document{
{_id=Serviced apartment, count=7}
}, Document{
{_id=Villa, count=7}
},
Document{
{_id=Bungalow, count=5}
},
Document{
{_id=Guesthouse, count=5}
}
]
}
}}
}}
}
1// run-geo-box-metadata-query.js
2
3// establish connection and set namespace
4const { MongoClient } = require("mongodb");
5const uri = "<connection-string>";
6const client = new MongoClient(uri);
7
8async function run() {
9 try {
10 const database = client.db("sample_airbnb");
11 const collection = database.collection("listingsAndReviews");
12
13 // define query
14 const agg = [
15 {
16 "$searchMeta": {
17 "facet": {
18 "operator": {
19 "geoWithin": {
20 "path": "address.location",
21 "box": {
22 "bottomLeft": {
23 "type": "Point",
24 "coordinates": [112.467, -55.050]
25 },
26 "topRight": {
27 "type": "Point",
28 "coordinates": [168.000, -9.133]
29 }
30 }
31 }
32 },
33 "facets": {
34 "propertyTypeFacet": {
35 "type": "string",
36 "path": "property_type"
37 }
38 }
39 }
40 }
41 }
42 ];
43
44 // run query and print results
45 const result = collection.aggregate(agg);
46 await result.forEach((doc) => {
47 console.log(JSON.stringify(doc, null, 2));
48 });
49 } finally {
50 await client.close();
51 }
52}
53run().catch(console.dir);
{
"count": {
"lowerBound": 610
},
"facet": {
"propertyTypeFacet": {
"buckets": [
{
"_id": "Apartment",
"count": 334
},
{
"_id": "House",
"count": 168
},
{
"_id": "Townhouse",
"count": 29
},
{
"_id": "Guest suite",
"count": 20
},
{
"_id": "Condominium",
"count": 11
},
{
"_id": "Cabin",
"count": 8
},
{
"_id": "Serviced apartment",
"count": 7
},
{
"_id": "Villa",
"count": 7
},
{
"_id": "Bungalow",
"count": 5
},
{
"_id": "Guesthouse",
"count": 5
}
]
}
}
}
1# run-geo-box-metadata-query.py
2
3# establish connection and set namespace
4import pymongo
5
6client = pymongo.MongoClient("<connection-string>")
7database = client["sample_airbnb"]
8collection = database["listingsAndReviews"]
9
10# define query
11query = [
12 {
13 "$searchMeta": {
14 "facet": {
15 "operator": {
16 "geoWithin": {
17 "path": "address.location",
18 "box": {
19 "bottomLeft": {
20 "type": "Point",
21 "coordinates": [112.467, -55.050]
22 },
23 "topRight": {
24 "type": "Point",
25 "coordinates": [168.000, -9.133]
26 }
27 }
28 }
29 },
30 "facets": {
31 "propertyTypeFacet": {
32 "type": "string",
33 "path": "property_type"
34 }
35 }
36 }
37 }
38 }
39]
40
41# run query and print results
42results = collection.aggregate(query)
43for document in results:
44 print(document)
{'count': {'lowerBound': 610}, 'facet': {'propertyTypeFacet': {'buckets': [{'_id': 'Apartment', 'count': 334}, {'_id': 'House', 'count': 168}, {'_id': 'Townhouse', 'count': 29}, {'_id': 'Guest suite', 'count': 20}, {'_id': 'Condominium', 'count': 11}, {'_id': 'Cabin', 'count': 8}, {'_id': 'Serviced apartment', 'count': 7}, {'_id': 'Villa', 'count': 7}, {'_id': 'Bungalow', 'count': 5}, {'_id': 'Guesthouse', 'count': 5}]}}}

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 denominados default em sua query do MongoDB Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index.


➤ Use o menu suspenso Selecione seu idioma nesta página para definir o idioma dos exemplos nesta seção.


{
"$search": {
"geoWithin": {
"circle": {
"center": {
"type": "Point",
"coordinates": [-73.54, 45.54]
},
"radius": 1600
},
"path": "address.location"
}
}
}
1SCORE: 1 _id: “10059244
2 access: "Vous avez accès à tout l'appartement."
3 accommodates: 2
4 address: Object
5 street: "Montréal, Québec, Canada"
6 suburb: "Hochelaga-Maisonneuve"
7 government_area: "Mercier-Hochelaga-Maisonneuve"
8 market: "Montreal"
9 country: "Canada"
10 country_code: "CA"
11 location: Object
12 type: "Point"
13 coordinates: Array (2)
14 0: -73.54949
15 1: 45.54548
16 is_location_exact: false
17
18SCORE: 1 _id: “13732894
19 access: "Accès à la chambre, à la salle de bain, à la salle à dîner, à la cuisi…"
20 accommodates: 2
21 address: Object
22 street: "Montréal, QC, Canada"
23 suburb: "Gay Village"
24 government_area: "Ville-Marie"
25 market: "Montreal"
26 country: "Canada"
27 country_code: "CA"
28 location: Object
29 type: "Point"
30 coordinates: Array (2)
31 0: -73.54985
32 1: 45.52797
33 is_location_exact: false
34
35SCORE: 1 _id: “14896503
36 access: "Appartment, you have access to the back balcony and in the shed there …"
37 accommodates: 4
38 address: Object
39 street: "Montréal, Québec, Canada"
40 suburb: "Mercier-Hochelaga-Maisonneuve"
41 government_area: "Mercier-Hochelaga-Maisonneuve"
42 market: "Montreal"
43 country: "Canada"
44 country_code: "CA"
45 location: Object
46 type: "Point"
47 coordinates: Array (2)
48 0: -73.55208
49 1: 45.55157
50 is_location_exact: true
51
52SCORE: 1 _id: “16507273
53 access: "You have all the apartment."
54 accommodates: 4
55 address: Object
56 street: "Montréal, QC, Canada"
57 suburb: "Hochelaga-Maisonneuve"
58 government_area: "Mercier-Hochelaga-Maisonneuve"
59 market: "Montreal"
60 country: "Canada"
61 country_code: "CA"
62 location: Object
63 type: "Point"
64 coordinates: Array (2)
65 0: -73.54141
66 1: 45.5447
67 is_location_exact: false
68
69SCORE: 1 _id: “18139662
70 access: "-Access to: Large private double room Bed sheets, linens, covers, to…"
71 accommodates: 3
72 address: Object
73 street: "Montréal, Québec, Canada"
74 suburb: "Gay Village"
75 government_area: "Ville-Marie"
76 market: "Montreal"
77 country: "Canada"
78 country_code: "CA"
79 location: Object
80 type: "Point"
81 coordinates: Array (2)
82 0: -73.54921
83 1: 45.52811
84 is_location_exact: true
85
86SCORE: 1 _id: “18485581
87 access: "Fully independent apartment with its own entrance and own set of keys.…"
88 accommodates: 4
89 address: Object
90 street: "Montréal, Québec, Canada"
91 suburb: "Le Plateau-Mont-Royal"
92 government_area: "Ville-Marie"
93 market: "Montreal"
94 country: "Canada"
95 country_code: "CA"
96 location: Object
97 type: "Point"
98 coordinates: Array (2)
99 0: -73.55818
100 1: 45.53688
101 is_location_exact: true
102
103SCORE: 1 _id: “19086528
104 access: "Vous aurez accès à toutes les pièces communes de la maison ( Salon, cu…"
105 accommodates: 6
106 address: Object
107 street: "Montréal, Québec, Canada"
108 suburb: "Gay Village"
109 government_area: "Ville-Marie"
110 market: "Montreal"
111 country: "Canada"
112 country_code: "CA"
113 location: Object
114 type: "Point"
115 coordinates: Array (2)
116 0: -73.54923
117 1: 45.52764
118 is_location_exact: true
119
120SCORE: 1 _id: “19296654
121 access: "The whole home will be yours!"
122 accommodates: 6
123 address: Object
124 street: "Montréal, Québec, Canada"
125 suburb: "Mercier-Hochelaga-Maisonneuve"
126 government_area: "Mercier-Hochelaga-Maisonneuve"
127 market: "Montreal"
128 country: "Canada"
129 country_code: "CA"
130 location: Object
131 type: "Point"
132 coordinates: Array (2)
133 0: -73.53516
134 1: 45.54855
135 is_location_exact: true
136
137SCORE: 1 _id: “20254510
138 access: ""
139 accommodates: 2
140 address: Object
141 street: "Montréal, Québec, Canada"
142 suburb: "Mercier-Hochelaga-Maisonneuve"
143 government_area: "Mercier-Hochelaga-Maisonneuve"
144 market: "Montreal"
145 country: "Canada"
146 country_code: "CA"
147 location: Object
148 type: "Point"
149 coordinates: Array (2)
150 0: -73.53971
151 1: 45.54737
152 is_location_exact: true
153
154SCORE: 1 _id: “21248215
155 access: "You have access to the backyard as well as a parking space. Depending …"
156 accommodates: 4
157 address: Object
158 street: "Montréal, Québec, Canada"
159 suburb: "Mercier-Hochelaga-Maisonneuve"
160 government_area: "Ville-Marie"
161 market: "Montreal"
162 country: "Canada"
163 country_code: "CA"
164 location: Object
165 type: "Point"
166 coordinates: Array (2)
167 0: -73.54414
168 1: 45.52984
169 is_location_exact: true
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])
SCORE: 1 _id: “10059244
access: "Vous avez accès à tout l'appartement."
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54949
1: 45.54548
is_location_exact: false
SCORE: 1 _id: “13732894
access: "Accès à la chambre, à la salle de bain, à la salle à dîner, à la cuisi…"
accommodates: 2
address: Object
street: "Montréal, QC, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54985
1: 45.52797
is_location_exact: false
SCORE: 1 _id: “14896503
access: "Appartment, you have access to the back balcony and in the shed there …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55208
1: 45.55157
is_location_exact: true
SCORE: 1 _id: “16507273
access: "You have all the apartment."
accommodates: 4
address: Object
street: "Montréal, QC, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54141
1: 45.5447
is_location_exact: false
SCORE: 1 _id: “18139662
access: "-Access to: Large private double room Bed sheets, linens, covers, to…"
accommodates: 3
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54921
1: 45.52811
is_location_exact: true
SCORE: 1 _id: “18485581
access: "Fully independent apartment with its own entrance and own set of keys.…"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Le Plateau-Mont-Royal"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55818
1: 45.53688
is_location_exact: true
SCORE: 1 _id: “19086528
access: "Vous aurez accès à toutes les pièces communes de la maison ( Salon, cu…"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54923
1: 45.52764
is_location_exact: true
SCORE: 1 _id: “19296654
access: "The whole home will be yours!"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53516
1: 45.54855
is_location_exact: true
SCORE: 1 _id: “20254510
access: ""
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53971
1: 45.54737
is_location_exact: true
SCORE: 1 _id: “21248215
access: "You have access to the backyard as well as a parking space. Depending …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54414
1: 45.52984
is_location_exact: true

Para aprender como executar as seguintes queries no MongoDB Compass, consulte Definir sua query.

estágio do pipeline
Query

$search

{
"geoWithin": {
"circle": {
"center": {
"type": "Point",
"coordinates": [-73.54, 45.54]
},
"radius": 1600
},
"path": "address.location"
}
}

$limit

3

$project

{
"_id": 0,
"name": 1,
"address": 1
}
SCORE: 1 _id: “10059244
access: "Vous avez accès à tout l'appartement."
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54949
1: 45.54548
is_location_exact: false
SCORE: 1 _id: “13732894
access: "Accès à la chambre, à la salle de bain, à la salle à dîner, à la cuisi…"
accommodates: 2
address: Object
street: "Montréal, QC, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54985
1: 45.52797
is_location_exact: false
SCORE: 1 _id: “14896503
access: "Appartment, you have access to the back balcony and in the shed there …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55208
1: 45.55157
is_location_exact: true
SCORE: 1 _id: “16507273
access: "You have all the apartment."
accommodates: 4
address: Object
street: "Montréal, QC, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54141
1: 45.5447
is_location_exact: false
SCORE: 1 _id: “18139662
access: "-Access to: Large private double room Bed sheets, linens, covers, to…"
accommodates: 3
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54921
1: 45.52811
is_location_exact: true
SCORE: 1 _id: “18485581
access: "Fully independent apartment with its own entrance and own set of keys.…"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Le Plateau-Mont-Royal"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55818
1: 45.53688
is_location_exact: true
SCORE: 1 _id: “19086528
access: "Vous aurez accès à toutes les pièces communes de la maison ( Salon, cu…"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54923
1: 45.52764
is_location_exact: true
SCORE: 1 _id: “19296654
access: "The whole home will be yours!"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53516
1: 45.54855
is_location_exact: true
SCORE: 1 _id: “20254510
access: ""
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53971
1: 45.54737
is_location_exact: true
SCORE: 1 _id: “21248215
access: "You have access to the backyard as well as a parking space. Depending …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54414
1: 45.52984
is_location_exact: true
1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.GeoJsonObjectModel;
6using MongoDB.Driver.Search;
7
8public class GeoCircleQuery
9{
10 private const string MongoConnectionString = "<connection-string>";
11
12 public static void Main(string[] args)
13 {
14 // allow automapping of the camelCase database fields to our PropertyDocument
15 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
16 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
17
18 // connect to your Atlas cluster
19 var mongoClient = new MongoClient(MongoConnectionString);
20 var airbnbDatabase = mongoClient.GetDatabase("sample_airbnb");
21 var listingsCollection = airbnbDatabase.GetCollection<PropertyDocument>("listingsAndReviews");
22
23 // define and run pipeline
24 var results = listingsCollection.Aggregate()
25 .Search(Builders<PropertyDocument>.Search.GeoWithin(
26 property => property.Address!.Location,
27 new GeoWithinCircle<GeoJson2DCoordinates>(
28 new GeoJsonPoint<GeoJson2DCoordinates>(new GeoJson2DCoordinates(-73.54, 45.54)),
29 1600
30 )
31 ))
32 .Limit(3)
33 .Project<PropertyDocument>(Builders<PropertyDocument>.Projection
34 .Include(property => property.Name)
35 .Include(property => property.Address)
36 .Exclude(property => property.Id))
37 .ToList();
38
39 // print results
40 foreach (var property in results)
41 {
42 Console.WriteLine(property.ToJson());
43 }
44 }
45}
46
47[BsonIgnoreExtraElements]
48public class PropertyDocument
49{
50 [BsonIgnoreIfDefault]
51 public ObjectId Id { get; set; }
52 public string? Name { get; set; }
53 public AddressDocument? Address { get; set; }
54}
55
56[BsonIgnoreExtraElements]
57public class AddressDocument
58{
59 public GeoJsonPoint<GeoJson2DCoordinates>? Location { get; set; }
60 public string? Street { get; set; }
61 public string? Country { get; set; }
62}
SCORE: 1 _id: “10059244
access: "Vous avez accès à tout l'appartement."
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54949
1: 45.54548
is_location_exact: false
SCORE: 1 _id: “13732894
access: "Accès à la chambre, à la salle de bain, à la salle à dîner, à la cuisi…"
accommodates: 2
address: Object
street: "Montréal, QC, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54985
1: 45.52797
is_location_exact: false
SCORE: 1 _id: “14896503
access: "Appartment, you have access to the back balcony and in the shed there …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55208
1: 45.55157
is_location_exact: true
SCORE: 1 _id: “16507273
access: "You have all the apartment."
accommodates: 4
address: Object
street: "Montréal, QC, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54141
1: 45.5447
is_location_exact: false
SCORE: 1 _id: “18139662
access: "-Access to: Large private double room Bed sheets, linens, covers, to…"
accommodates: 3
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54921
1: 45.52811
is_location_exact: true
SCORE: 1 _id: “18485581
access: "Fully independent apartment with its own entrance and own set of keys.…"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Le Plateau-Mont-Royal"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55818
1: 45.53688
is_location_exact: true
SCORE: 1 _id: “19086528
access: "Vous aurez accès à toutes les pièces communes de la maison ( Salon, cu…"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54923
1: 45.52764
is_location_exact: true
SCORE: 1 _id: “19296654
access: "The whole home will be yours!"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53516
1: 45.54855
is_location_exact: true
SCORE: 1 _id: “20254510
access: ""
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53971
1: 45.54737
is_location_exact: true
SCORE: 1 _id: “21248215
access: "You have access to the backyard as well as a parking space. Depending …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54414
1: 45.52984
is_location_exact: true
1package main
2
3import (
4 "context"
5 "encoding/json"
6 "fmt"
7 "time"
8
9 "go.mongodb.org/mongo-driver/v2/bson"
10 "go.mongodb.org/mongo-driver/v2/mongo"
11 "go.mongodb.org/mongo-driver/v2/mongo/options"
12)
13
14// define structure of listingsAndReviews collection
15type Property struct {
16 Name string `bson:"name" json:"name"`
17 PropertyType string `bson:"property_type" json:"property_type"`
18 Address struct {
19 Location struct {
20 Type string `bson:"type" json:"type"`
21 Coordinates []float64 `bson:"coordinates" json:"coordinates"`
22 } `bson:"location" json:"location"`
23 Street string `bson:"street" json:"street"`
24 Country string `bson:"country" json:"country"`
25 } `bson:"address" json:"address"`
26 Score float64 `bson:"score" json:"score"`
27}
28
29func main() {
30 var err error
31 // connect to the Atlas cluster
32 ctx := context.Background()
33 client, err := mongo.Connect(options.Client().SetTimeout(5*time.Second).ApplyURI("<connection-string>"))
34 if err != nil {
35 panic(err)
36 }
37 defer client.Disconnect(ctx)
38 // set namespace
39 collection := client.Database("sample_airbnb").Collection("listingsAndReviews")
40 // define pipeline
41 searchStage := bson.D{{Key: "$search", Value: bson.M{
42 "geoWithin": bson.M{
43 "circle": bson.M{
44 "center": bson.M{
45 "type": "Point",
46 "coordinates": []float64{-73.54, 45.54},
47 },
48 "radius": 1600,
49 },
50 "path": "address.location",
51 },
52 }}}
53 limitStage := bson.D{{Key: "$limit", Value: 3}}
54 projectStage := bson.D{{Key: "$project", Value: bson.D{
55 {Key: "_id", Value: 0},
56 {Key: "name", Value: 1},
57 {Key: "address", Value: 1},
58 {Key: "property_type", Value: 1},
59 {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}},
60 }}}
61 // run pipeline
62 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
63 if err != nil {
64 panic(err)
65 }
66 // print results
67 var results []Property
68 if err = cursor.All(context.TODO(), &results); err != nil {
69 panic(err)
70 }
71
72 // Convert results to JSON and print
73 jsonResults, err := json.MarshalIndent(results, "", " ")
74 if err != nil {
75 panic(err)
76 }
77 fmt.Println(string(jsonResults))
78}
[
{
"name": "Ligne verte - à 15 min de métro du centre ville.",
"property_type": "Apartment",
"address": {
"location": {
"type": "Point",
"coordinates": [
-73.54949,
45.54548
]
},
"street": "Montréal, Québec, Canada",
"country": "Canada"
},
"score": 1
},
{
"name": "Belle chambre à côté Metro Papineau",
"property_type": "Apartment",
"address": {
"location": {
"type": "Point",
"coordinates": [
-73.54985,
45.52797
]
},
"street": "Montréal, QC, Canada",
"country": "Canada"
},
"score": 1
},
{
"name": "L'IDÉAL, ( à 2 min du métro Pie-IX ).",
"property_type": "Apartment",
"address": {
"location": {
"type": "Point",
"coordinates": [
-73.55208,
45.55157
]
},
"street": "Montréal, Québec, Canada",
"country": "Canada"
},
"score": 1
}
]
1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.excludeId;
5import static com.mongodb.client.model.Projections.fields;
6import static com.mongodb.client.model.Projections.include;
7import com.mongodb.client.MongoClient;
8import com.mongodb.client.MongoClients;
9import com.mongodb.client.MongoCollection;
10import com.mongodb.client.MongoDatabase;
11import org.bson.Document;
12
13public class GeoCircleQuery {
14 public static void main( String[] args ) {
15
16 // define query
17 Document agg = new Document("$search",
18 new Document("geoWithin",
19 new Document("circle",
20 new Document("center",
21 new Document("type", "Point")
22 .append("coordinates", Arrays.asList(-73.54, 45.54)))
23 .append("radius", 1600))
24 .append("path", "address.location")));
25
26 // specify connection
27 String uri = "<connection-string>";
28
29 // establish connection and set namespace
30 try (MongoClient mongoClient = MongoClients.create(uri)) {
31 MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
32 MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
33 // run query and print results
34 collection.aggregate(Arrays.asList(agg,
35 limit(3),
36 project(fields(excludeId(), include("name", "address")))))
37 .forEach(doc -> System.out.println(doc.toJson()));
38 }
39 }
40}
SCORE: 1 _id:10059244
access: "Vous avez accès à tout l'appartement."
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54949
1: 45.54548
is_location_exact: false
SCORE: 1 _id:13732894
access: "Accès à la chambre, à la salle de bain, à la salle à dîner, à la cuisi…"
accommodates: 2
address: Object
street: "Montréal, QC, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54985
1: 45.52797
is_location_exact: false
SCORE: 1 _id:14896503
access: "Appartment, you have access to the back balcony and in the shed there …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55208
1: 45.55157
is_location_exact: true
SCORE: 1 _id:16507273
access: "You have all the apartment."
accommodates: 4
address: Object
street: "Montréal, QC, Canada"
suburb: "Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54141
1: 45.5447
is_location_exact: false
SCORE: 1 _id:18139662
access: "-Access to: Large private double room Bed sheets, linens, covers, to…"
accommodates: 3
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54921
1: 45.52811
is_location_exact: true
SCORE: 1 _id:18485581
access: "Fully independent apartment with its own entrance and own set of keys.…"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Le Plateau-Mont-Royal"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.55818
1: 45.53688
is_location_exact: true
SCORE: 1 _id:19086528
access: "Vous aurez accès à toutes les pièces communes de la maison ( Salon, cu…"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Gay Village"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54923
1: 45.52764
is_location_exact: true
SCORE: 1 _id:19296654
access: "The whole home will be yours!"
accommodates: 6
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53516
1: 45.54855
is_location_exact: true
SCORE: 1 _id:20254510
access: ""
accommodates: 2
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Mercier-Hochelaga-Maisonneuve"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.53971
1: 45.54737
is_location_exact: true
SCORE: 1 _id:21248215
access: "You have access to the backyard as well as a parking space. Depending …"
accommodates: 4
address: Object
street: "Montréal, Québec, Canada"
suburb: "Mercier-Hochelaga-Maisonneuve"
government_area: "Ville-Marie"
market: "Montreal"
country: "Canada"
country_code: "CA"
location: Object
type: "Point"
coordinates: Array (2)
0: -73.54414
1: 45.52984
is_location_exact: true
1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_airbnb")
13 val collection = database.getCollection<Document>("listingsAndReviews")
14
15 runBlocking {
16 // define query
17 val agg = Document(
18 "\$search",
19 Document("geoWithin",
20 Document("circle",
21 Document("center",
22 Document("type", "Point")
23 .append("coordinates", listOf(-73.54, 45.54)))
24 .append("radius", 1600))
25 .append("path", "address.location"))
26 )
27
28 // run query and print results
29 val resultsFlow = collection.aggregate<Document>(
30 listOf(
31 agg,
32 limit(3),
33 project(fields(excludeId(), include("name", "address")))
34 )
35 )
36 resultsFlow.collect { println(it) }
37 }
38 mongoClient.close()
39}
Document{{name=Ligne verte - à 15 min de métro du centre ville., address=Document{{street=Montréal, Québec, Canada, suburb=Hochelaga-Maisonneuve, government_area=Mercier-Hochelaga-Maisonneuve, market=Montreal, country=Canada, country_code=CA, location=Document{{type=Point, coordinates=[-73.54949, 45.54548], is_location_exact=false}}}}}}
Document{{name=Belle chambre à côté Metro Papineau, address=Document{{street=Montréal, QC, Canada, suburb=Gay Village, government_area=Ville-Marie, market=Montreal, country=Canada, country_code=CA, location=Document{{type=Point, coordinates=[-73.54985, 45.52797], is_location_exact=false}}}}}}
Document{{name=L'IDÉAL, ( à 2 min du métro Pie-IX )., address=Document{{street=Montréal, Québec, Canada, suburb=Mercier-Hochelaga-Maisonneuve, government_area=Mercier-Hochelaga-Maisonneuve, market=Montreal, country=Canada, country_code=CA, location=Document{{type=Point, coordinates=[-73.55208, 45.55157], is_location_exact=true}}}}}}
1const { MongoClient } = require("mongodb");
2
3// connect to your Atlas cluster
4const uri = "<connection-string>";
5
6const client = new MongoClient(uri);
7
8async function run() {
9 try {
10 await client.connect();
11
12 // set namespace
13 const database = client.db("sample_airbnb");
14 const coll = database.collection("listingsAndReviews");
15
16 // define pipeline
17 const agg = [
18 {
19 '$search': {
20 'geoWithin': {
21 'circle': {
22 'center': {
23 'type': 'Point',
24 'coordinates': [-73.54, 45.54]
25 },
26 'radius': 1600
27 },
28 'path': 'address.location'
29 }
30 }
31 }, {
32 '$limit': 3
33 }, {
34 '$project': {
35 '_id': 0,
36 'name': 1,
37 'address': 1
38 }
39 }
40 ];
41
42 // run pipeline
43 const result = coll.aggregate(agg);
44
45 // print results
46 await result.forEach((doc) => console.log(doc));
47 } finally {
48 await client.close();
49 }
50}
51run().catch(console.dir);
{
name: 'Ligne verte - à 15 min de métro du centre ville.',
address: {
street: 'Montréal, Québec, Canada',
suburb: 'Hochelaga-Maisonneuve',
government_area: 'Mercier-Hochelaga-Maisonneuve',
market: 'Montreal',
country: 'Canada',
country_code: 'CA',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
}
}
{
name: 'Belle chambre à côté Metro Papineau',
address: {
street: 'Montréal, QC, Canada',
suburb: 'Gay Village',
government_area: 'Ville-Marie',
market: 'Montreal',
country: 'Canada',
country_code: 'CA',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
}
}
{
name: "L'IDÉAL, ( à 2 min du métro Pie-IX ).",
address: {
street: 'Montréal, Québec, Canada',
suburb: 'Mercier-Hochelaga-Maisonneuve',
government_area: 'Mercier-Hochelaga-Maisonneuve',
market: 'Montreal',
country: 'Canada',
country_code: 'CA',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
}
}
1import pymongo
2import dns.resolver
3
4# connect to your Atlas cluster
5client = pymongo.MongoClient("<connection-string>")
6
7# define pipeline
8pipeline = [
9 {
10 "$search": {
11 "geoWithin": {
12 "circle": {
13 "center": {
14 "type": "Point",
15 "coordinates": [-73.54, 45.54]
16 },
17 "radius": 1600
18 },
19 "path": "address.location"
20 }
21 }
22 },
23 {
24 "$limit": 3
25 },
26 {
27 "$project": {
28 "_id": 0,
29 "name": 1,
30 "address": 1
31 }
32 }
33]
34
35# run pipeline
36result = client.sample_airbnb.listingsAndReviews.aggregate(pipeline)
37
38# print results
39for i in result:
40 print(i)
{'name': 'Ligne verte - à 15 min de métro du centre ville.', 'address': {'street': 'Montréal, Québec, Canada', 'suburb': 'Hochelaga-Maisonneuve', 'government_area': 'Mercier-Hochelaga-Maisonneuve', 'market': 'Montreal', 'country': 'Canada', 'country_code': 'CA', 'location': {'type': 'Point', 'coordinates': [-73.54949, 45.54548], 'is_location_exact': False}}}
{'name': 'Belle chambre à côté Metro Papineau', 'address': {'street': 'Montréal, QC, Canada', 'suburb': 'Gay Village', 'government_area': 'Ville-Marie', 'market': 'Montreal', 'country': 'Canada', 'country_code': 'CA', 'location': {'type': 'Point', 'coordinates': [-73.54985, 45.52797], 'is_location_exact': False}}}
{'name': "L'IDÉAL, ( à 2 min du métro Pie-IX ).", 'address': {'street': 'Montréal, Québec, Canada', 'suburb': 'Mercier-Hochelaga-Maisonneuve', 'government_area': 'Mercier-Hochelaga-Maisonneuve', 'market': 'Montreal', 'country': 'Canada', 'country_code': 'CA', 'location': {'type': 'Point', 'coordinates': [-73.55208, 45.55157], 'is_location_exact': True}}}

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 denominados default em sua query do MongoDB Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index.


➤ Use o menu suspenso Selecione seu idioma nesta página para definir o idioma dos exemplos nesta seção.


A seguinte consulta do MongoDB Search:

  • Usa um estágio composto $search para:

    • Especifique que os resultados must estejam dentro de um Polygon definido por um conjunto de coordinates.

    • Dê preferência aos resultados das propriedades do tipo condominium.

  • Usa um estágio $project para:

    • Excluir todos os campos, exceto name, address e property_type.

    • Adicione uma relevância score a cada documento retornado.

[
{
"$search": {
"index": "<INDEX-NAME>",
"compound": {
"must": [{
"geoWithin": {
"geometry": {
"type": "Polygon",
"coordinates": [[[ -161.323242, 22.512557 ],
[ -152.446289, 22.065278 ],
[ -156.09375, 17.811456 ],
[ -161.323242, 22.512557 ]]]
},
"path": "address.location"
}
}],
"should": [{
"text": {
"path": "property_type",
"query": "Condominium"
}
}]
}
}
}
]
1SCORE: 1 _id: “1001265
2 access: "Pool, hot tub and tennis"
3 accommodates: 2
4 address: Object
5 street: "Honolulu, HI, United States"
6 suburb: "Oʻahu"
7 government_area: "Primary Urban Center"
8 market: "Oahu"
9 country: "United States"
10 country_code: "US"
11 location: Object
12 type: "Point"
13 coordinates: Array (2)
14 0: -157.83919
15 1: 21.28634
16 is_location_exact: true
17
18SCORE: 1 _id: “1022200
19 access: ""
20 accommodates: 6
21 address: Object
22 street: "Kailua-Kona, HI, United States"
23 suburb: "Kailua/Kona"
24 government_area: "North Kona"
25 market: "The Big Island"
26 country: "United States"
27 country_code: "US"
28 location: Object
29 type: "Point"
30 coordinates: Array (2)
31 0: -155.96445
32 1: 19.5702
33 is_location_exact: true
34
35SCORE: 1 _id: “10227000
36 access: ""
37 accommodates: 4
38 address: Object
39 street: "Lahaina, HI, United States"
40 suburb: "Maui"
41 government_area: "Lahaina"
42 market: "Maui"
43 country: "United States"
44 country_code: "US"
45 location: Object
46 type: "Point"
47 coordinates: Array (2)
48 0: -156.68012
49 1: 20.96996
50 is_location_exact: true
51
52SCORE: 1 _id: “10266175
53 access: "Full access - Must go through 24 hour Security Gate - Lockstate door c…"
54 accommodates: 4
55 address: Object
56 street: "Waianae, HI, United States"
57 suburb: "Leeward Side"
58 government_area: "Waianae"
59 market: "Oahu"
60 country: "United States"
61 country_code: "US"
62 location: Object
63 type: "Point"
64 coordinates: Array (2)
65 0: -158.20291
66 1: 21.4818
67 is_location_exact: true
68
69SCORE: 1 _id: “10280433
70 access: ""
71 accommodates: 2
72 address: Object
73 street: "Volcano, HI, United States"
74 suburb: "Island of Hawaiʻi"
75 government_area: "Puna"
76 market: "The Big Island"
77 country: "United States"
78 country_code: "US"
79 location: Object
80 type: "Point"
81 coordinates: Array (2)
82 0: -155.21763
83 1: 19.42151
84 is_location_exact: false
85
86SCORE: 1 _id: “10317142
87 access: ""
88 accommodates: 14
89 address: Object
90 street: "Laie, HI, United States"
91 suburb: "Ko'olauloa"
92 government_area: "Koolauloa"
93 market: "Oahu"
94 country: "United States"
95 country_code: "US"
96 location: Object
97 type: "Point"
98 coordinates: Array (2)
99 0: -157.91952
100 1: 21.63549
101 is_location_exact: true
102
103SCORE: 1 _id: “10392282
104 access: "Private driveway to access the property, parking on site."
105 accommodates: 2
106 address: Object
107 street: "Waialua, HI, United States"
108 suburb: "Oʻahu"
109 government_area: "North Shore Oahu"
110 market: "Oahu"
111 country: "United States"
112 country_code: "US"
113 location: Object
114 type: "Point"
115 coordinates: Array (2)
116 0: -158.1602
117 1: 21.57561
118 is_location_exact: false
119
120SCORE: 1 _id: “1042446
121 access: ""
122 accommodates: 4
123 address: Object
124 street: "Kihei, HI, United States"
125 suburb: "Maui"
126 government_area: "Kihei-Makena"
127 market: "Maui"
128 country: "United States"
129 country_code: "US"
130 location: Object
131 type: "Point"
132 coordinates: Array (2)
133 0: -156.46881
134 1: 20.78621
135 is_location_exact: true
136
137SCORE: 1 _id: “10527243
138 access: ""
139 accommodates: 4
140 address: Object
141 street: "Hilo, HI, United States"
142 suburb: "Island of Hawaiʻi"
143 government_area: "South Hilo"
144 market: "The Big Island"
145 country: "United States"
146 country_code: "US"
147 location: Object
148 type: "Point"
149 coordinates: Array (2)
150 0: -155.09259
151 1: 19.73108
152 is_location_exact: true
153
154SCORE: 1 _id: “10548991
155 access: "You will have access to the entire home, which can be split into two s…"
156 accommodates: 11
157 address: Object
158 street: "Kailua-Kona, HI, United States"
159 suburb: "Island of Hawaiʻi"
160 government_area: "North Kona"
161 market: "The Big Island"
162 country: "United States"
163 country_code: "US"
164 location: Object
165 type: "Point"
166 coordinates: Array (2)
167 0: -155.97349
168 1: 19.61318
169 is_location_exact: false
db.listingsAndReviews.aggregate([
{
"$search": {
"index": "<INDEX-NAME>",
"compound": {
"must": [{
"geoWithin": {
"geometry": {
"type": "Polygon",
"coordinates": [[[ -161.323242, 22.512557 ],
[ -152.446289, 22.065278 ],
[ -156.09375, 17.811456 ],
[ -161.323242, 22.512557 ]]]
},
"path": "address.location"
}
}],
"should": [{
"text": {
"path": "property_type",
"query": "Condominium"
}
}]
}
}
},
{
"$limit": 10
},
{
$project: {
"_id": 0,
"name": 1,
"address": 1,
"property_type": 1,
score: { $meta: "searchScore" }
}
}
])
{
name: 'Ocean View Waikiki Marina w/prkg',
property_type: 'Condominium',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Oʻahu',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -157.83919, 21.28634 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!',
property_type: 'Condominium',
address: {
street: 'Lahaina, HI, United States',
suburb: 'Maui',
government_area: 'Lahaina',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.68012, 20.96996 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'Makaha Valley Paradise with OceanView',
property_type: 'Condominium',
address: {
street: 'Waianae, HI, United States',
suburb: 'Leeward Side',
government_area: 'Waianae',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -158.20291, 21.4818 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'March 2019 availability! Oceanview on Sugar Beach!',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.46881, 20.78621 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'Tropical Jungle Oasis',
property_type: 'Condominium',
address: {
street: 'Hilo, HI, United States',
suburb: 'Island of Hawaiʻi',
government_area: 'South Hilo',
market: 'The Big Island',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -155.09259, 19.73108 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: '2 Bdrm/2 Bath Family Suite Ocean View',
property_type: 'Condominium',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Waikiki',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -157.82696, 21.27971 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: '302 Kanai A Nalu Ocean front/view',
property_type: 'Condominium',
address: {
street: 'Wailuku, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.5039, 20.79664 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'Sugar Beach Resort 1BR Ground Floor Condo !',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.46697, 20.78484 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: '2 BR Oceanview - Great Location!',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Kihei/Wailea',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.44917, 20.73013 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'PALMS AT WAILEA #905-2BR-REMODELED-LARGE LANAI-AC',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.4409, 20.69735 ],
is_location_exact: true
}
},
score: 2.238388776779175
}
]

Para aprender como executar as seguintes queries no MongoDB Compass, consulte Definir sua query.

estágio do pipeline
Query

$search

{
'index': '<INDEX-NAME>',
'compound': {
'must': [
{
'geoWithin': {
'geometry': {
'type': 'Polygon',
'coordinates': [
[
[
-161.323242, 22.512557
], [
-152.446289, 22.065278
], [
-156.09375, 17.811456
], [
-161.323242, 22.512557
]
]
]
},
'path': 'address.location'
}
}
],
'should': [
{
'text': {
'path': 'property_type',
'query': 'Condominium'
}
}
]
}
}

$limit

10

$project

{
'_id': 0,
'name': 1,
'address': 1,
'property_type': 1,
'score': {
'$meta': 'searchScore'
}
}
{
name: 'Ocean View Waikiki Marina w/prkg',
property_type: 'Condominium',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Oʻahu',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -157.83919, 21.28634 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!',
property_type: 'Condominium',
address: {
street: 'Lahaina, HI, United States',
suburb: 'Maui',
government_area: 'Lahaina',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.68012, 20.96996 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'Makaha Valley Paradise with OceanView',
property_type: 'Condominium',
address: {
street: 'Waianae, HI, United States',
suburb: 'Leeward Side',
government_area: 'Waianae',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -158.20291, 21.4818 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'March 2019 availability! Oceanview on Sugar Beach!',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.46881, 20.78621 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'Tropical Jungle Oasis',
property_type: 'Condominium',
address: {
street: 'Hilo, HI, United States',
suburb: 'Island of Hawaiʻi',
government_area: 'South Hilo',
market: 'The Big Island',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -155.09259, 19.73108 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: '2 Bdrm/2 Bath Family Suite Ocean View',
property_type: 'Condominium',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Waikiki',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -157.82696, 21.27971 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: '302 Kanai A Nalu Ocean front/view',
property_type: 'Condominium',
address: {
street: 'Wailuku, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.5039, 20.79664 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'Sugar Beach Resort 1BR Ground Floor Condo !',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.46697, 20.78484 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: '2 BR Oceanview - Great Location!',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Kihei/Wailea',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.44917, 20.73013 ],
is_location_exact: true
}
},
score: 2.238388776779175
},
{
name: 'PALMS AT WAILEA #905-2BR-REMODELED-LARGE LANAI-AC',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: {
type: 'Point',
coordinates: [ -156.4409, 20.69735 ],
is_location_exact: true
}
},
score: 2.238388776779175
}
1using MongoDB.Bson;
2using MongoDB.Bson.IO;
3using MongoDB.Bson.Serialization;
4using MongoDB.Bson.Serialization.Attributes;
5using MongoDB.Bson.Serialization.Conventions;
6using MongoDB.Driver;
7using MongoDB.Driver.GeoJsonObjectModel;
8using MongoDB.Driver.Search;
9using System;
10
11public class GeoQuery
12{
13 private const string MongoConnectionString = "<connection-string>";
14
15 public static void Main(string[] args)
16 {
17 // allow automapping of the camelCase database fields to our AirbnbDocument
18 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
19 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
20
21 // connect to your Atlas cluster
22 var mongoClient = new MongoClient(MongoConnectionString);
23 var airbnbDatabase = mongoClient.GetDatabase("sample_airbnb");
24 var airbnbCollection = airbnbDatabase.GetCollection<AirbnbDocument>("listingsAndReviews");
25
26 // declare data for the compound query
27 string property_type = "Condominium";
28 var coordinates = new GeoJson2DCoordinates[]
29 {
30 new(-161.323242, 22.512557),
31 new(-152.446289, 22.065278),
32 new(-156.09375, 17.811456),
33 new(-161.323242, 22.512557)
34 };
35 var polygon = GeoJson.Polygon(coordinates);
36
37 // define and run pipeline
38 var results = airbnbCollection.Aggregate()
39 .Search(Builders<AirbnbDocument>.Search.Compound()
40 .Must(Builders<AirbnbDocument>.Search.GeoWithin(airbnb => airbnb.Address!.Location, polygon))
41 .Should((Builders<AirbnbDocument>.Search.Text(airbnb => airbnb.PropertyType, property_type))))
42 .Limit (10)
43 .Project<AirbnbDocument>(Builders<AirbnbDocument>.Projection
44 .Include(airbnb => airbnb.PropertyType)
45 .Include(airbnb => airbnb.Address!.Location)
46 .Include(airbnb => airbnb.Name)
47 .Exclude(airbnb => airbnb.Id)
48 .MetaSearchScore(airbnb => airbnb.Score))
49 .ToList();
50
51 // print results
52 foreach (var x in results) {
53 Console.WriteLine(x.ToJson());
54 }
55 }
56}
57[BsonIgnoreExtraElements]
58public class AirbnbDocument
59{
60 [BsonIgnoreIfDefault]
61 public ObjectId Id { get; set; }
62 public string? Name { get; set; }
63 [BsonElement("property_type")]
64 public string? PropertyType { get; set; }
65 public Address? Address { get; set; }
66 public double Score { get; set; }
67}
68[BsonIgnoreExtraElements]
69public class Address
70{
71 public GeoJsonPoint<GeoJson2DCoordinates>? Location { get; set; }
72}
{
"name" : "Ocean View Waikiki Marina w/prkg",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-157.83919, 21.286339999999999],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-156.68011999999999, 20.96996],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "Makaha Valley Paradise with OceanView",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-158.20291, 21.4818],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "March 2019 availability! Oceanview on Sugar Beach!",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-156.46880999999999, 20.786210000000001],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "Tropical Jungle Oasis",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-155.09259, 19.731079999999999],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "2 Bdrm/2 Bath Family Suite Ocean View",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-157.82696000000001, 21.279710000000001],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "302 Kanai A Nalu Ocean front/view",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-156.50389999999999, 20.79664],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "Sugar Beach Resort 1BR Ground Floor Condo !",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-156.46697, 20.784839999999999],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "2 BR Oceanview - Great Location!",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-156.44917000000001, 20.730129999999999],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
{
"name" : "PALMS AT WAILEA #905-2BR-REMODELED-LARGE LANAI-AC",
"property_type" : "Condominium",
"address" : {
"location" : {
"type" : "Point",
"coordinates" : [-156.4409, 20.69735],
"is_location_exact" : true
}
},
"score" : 2.2383887767791748
}
1package main
2
3import (
4 "context"
5 "fmt"
6
7 "go.mongodb.org/mongo-driver/v2/bson"
8 "go.mongodb.org/mongo-driver/v2/mongo"
9 "go.mongodb.org/mongo-driver/v2/mongo/options"
10)
11
12func main() {
13 // connect to your Atlas cluster
14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>"))
15 if err != nil {
16 panic(err)
17 }
18 defer client.Disconnect(context.TODO())
19
20 // set namespace
21 collection := client.Database("sample_airbnb").Collection("listingsAndReviews")
22
23 // define polygon
24 polygon := [][][]float64{{
25 {-161.323242, 22.512557},
26 {-152.446289, 22.065278},
27 {-156.09375, 17.811456},
28 {-161.323242, 22.512557},
29 }}
30
31 // define pipeline
32 searchStage := bson.D{{"$search", bson.M{
33 "index": "<INDEX-NAME>",
34 "compound": bson.M{
35 "must": bson.M{
36 "geoWithin": bson.M{
37 "geometry": bson.M{
38 "type": "Polygon",
39 "coordinates": polygon,
40 },
41 "path": "address.location",
42 },
43 },
44 "should": bson.M{
45 "text": bson.M{
46 "path": "property_type",
47 "query": "Condominium",
48 }},
49 },
50 },
51 }}
52 limitStage := bson.D{{"$limit", 10}}
53 projectStage := bson.D{{"$project", bson.D{{"name", 1}, {"address", 1}, {"property_type", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
54
55 // run pipeline
56 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
57 if err != nil {
58 panic(err)
59 }
60
61 // print results
62 var results []bson.D
63 if err = cursor.All(context.TODO(), &results); err != nil {
64 panic(err)
65 }
66 for _, result := range results {
67 fmt.Println(result)
68 }
69}
package main
import (
"context"
"fmt"
"go.mongodb.org/mongo-driver/v2/bson"
"go.mongodb.org/mongo-driver/v2/mongo"
"go.mongodb.org/mongo-driver/v2/mongo/options"
)
func main() {
// connect to your Atlas cluster
client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>"))
if err != nil {
panic(err)
}
defer client.Disconnect(context.TODO())
// set namespace
collection := client.Database("sample_airbnb").Collection("listingsAndReviews")
// define polygon
polygon := [][][]float64{{
{-161.323242, 22.512557},
{-152.446289, 22.065278},
{-156.09375, 17.811456},
{-161.323242, 22.512557},
}}
// define pipeline
searchStage := bson.D{{"$search", bson.M{
"index": "<INDEX-NAME>",
"compound": bson.M{
"must": bson.M{
"geoWithin": bson.M{
"geometry": bson.M{
"type": "Polygon",
"coordinates": polygon,
},
"path": "address.location",
},
},
"should": bson.M{
"text": bson.M{
"path": "property_type",
"query": "Condominium",
}},
},
},
}}
limitStage := bson.D{{"$limit", 10}}
projectStage := bson.D{{"$project", bson.D{{"name", 1}, {"address", 1}, {"property_type", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "searchScore"}}}}}}
// run pipeline
cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage})
if err != nil {
panic(err)
}
// print results
var results []bson.D
if err = cursor.All(context.TODO(), &results); err != nil {
panic(err)
}
for _, result := range results {
fmt.Println(result)
}
}
1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.computed;
5import static com.mongodb.client.model.Projections.excludeId;
6import static com.mongodb.client.model.Projections.fields;
7import static com.mongodb.client.model.Projections.include;
8import com.mongodb.client.MongoClient;
9import com.mongodb.client.MongoClients;
10import com.mongodb.client.MongoCollection;
11import com.mongodb.client.MongoDatabase;
12import org.bson.Document;
13
14public class GeoPolygonQuery {
15 public static void main( String[] args ) {
16 Document agg = new Document( "$search",
17 new Document( "index", "<INDEX-NAME>")
18 .append("compound",
19 new Document("must", Arrays.asList(new Document("geoWithin",
20 new Document("geometry",
21 new Document("type", "Polygon")
22 .append("coordinates", Arrays.asList(Arrays.asList(Arrays.asList(-161.323242d, 22.512557d), Arrays.asList(-152.446289d, 22.065278d), Arrays.asList(-156.09375d, 17.811456d), Arrays.asList(-161.323242d, 22.512557d)))))
23 .append("path", "address.location"))))
24 .append("should", Arrays.asList(new Document("text",
25 new Document("path", "property_type")
26 .append("query", "Condominium"))))));
27
28 String uri = "<connection-string>";
29
30 try (MongoClient mongoClient = MongoClients.create(uri)) {
31 MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
32 MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
33
34 collection.aggregate(Arrays.asList(agg,
35 limit(10),
36 project(fields(excludeId(), include("name", "address", "property_type"), computed("score", new Document("$meta", "searchScore"))))))
37 .forEach(doc -> System.out.println(doc.toJson() + "\n"));
38 }
39 }
40}
{"name": "Ocean View Waikiki Marina w/prkg", "property_type": "Condominium", "address": {"street": "Honolulu, HI, United States", "suburb": "O\u02bbahu", "government_area": "Primary Urban Center", "market": "Oahu", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-157.83919, 21.28634], "is_location_exact": true}}, "score": 1.0},
{"name": "Kailua-Kona, Kona Coast II 2b condo", "property_type": "Apartment", "address": {"street": "Kailua-Kona, HI, United States", "suburb": "Kailua/Kona", "government_area": "North Kona", "market": "The Big Island", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-155.96445, 19.5702], "is_location_exact": true}}, "score": 1.0},
{"name": "LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!", "property_type": "Condominium", "address": {"street": "Lahaina, HI, United States", "suburb": "Maui", "government_area": "Lahaina", "market": "Maui", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-156.68012, 20.96996], "is_location_exact": true}}, "score": 1.0},
{"name": "Makaha Valley Paradise with OceanView", "property_type": "Condominium", "address": {"street": "Waianae, HI, United States", "suburb": "Leeward Side", "government_area": "Waianae", "market": "Oahu", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-158.20291, 21.4818], "is_location_exact": true}}, "score": 1.0},
{"name": "~Ao Lele~ Flying Cloud", "property_type": "Treehouse", "address": {"street": "Volcano, HI, United States", "suburb": "Island of Hawai\u02bbi", "government_area": "Puna", "market": "The Big Island", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-155.21763, 19.42151], "is_location_exact": false}}, "score": 1.0},
{"name": "Private OceanFront - Bathtub Beach. Spacious House", "property_type": "House", "address": {"street": "Laie, HI, United States", "suburb": "Ko'olauloa", "government_area": "Koolauloa", "market": "Oahu", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-157.91952, 21.63549], "is_location_exact": true}}, "score": 1.0},
{"name": "Banyan Bungalow", "property_type": "Bungalow", "address": {"street": "Waialua, HI, United States", "suburb": "O\u02bbahu", "government_area": "North Shore Oahu", "market": "Oahu", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-158.1602, 21.57561], "is_location_exact": false}}, "score": 1.0},
{"name": "March 2019 availability! Oceanview on Sugar Beach!", "property_type": "Condominium", "address": {"street": "Kihei, HI, United States", "suburb": "Maui", "government_area": "Kihei-Makena", "market": "Maui", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-156.46881, 20.78621], "is_location_exact": true}}, "score": 1.0},
{"name": "Tropical Jungle Oasis", "property_type": "Condominium", "address": {"street": "Hilo, HI, United States", "suburb": "Island of Hawai\u02bbi", "government_area": "South Hilo", "market": "The Big Island", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-155.09259, 19.73108], "is_location_exact": true}}, "score": 1.0},
{"name": "Jubilee By The Sea (Ocean Views)", "property_type": "House", "address": {"street": "Kailua-Kona, HI, United States", "suburb": "Island of Hawai\u02bbi", "government_area": "North Kona", "market": "The Big Island", "country": "United States", "country_code": "US", "location": {"type": "Point", "coordinates": [-155.97349, 19.61318], "is_location_exact": false}}, "score": 1.0}

O seguinte exemplo de código:

  • Importa pacotes e dependências do mongodb .

  • Estabelece uma conexão com seu cluster.

  • Imprime os documentos que correspondem à query da instância AggregateFlow.

1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // connect to your Atlas cluster
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12
13 // set namespace
14 val database = mongoClient.getDatabase("sample_airbnb")
15 val collection = database.getCollection<Document>("listingsAndReviews")
16
17 runBlocking {
18 // define pipeline
19 val agg = Document(
20 "\$search",
21 Document("index", "<INDEX-NAME>")
22 .append(
23 "compound",
24 Document(
25 "must", listOf(
26 Document(
27 "geoWithin",
28 Document(
29 "geometry",
30 Document("type", "Polygon")
31 .append(
32 "coordinates",
33 listOf(
34 listOf(
35 listOf(-161.323242, 22.512557),
36 listOf(-152.446289, 22.065278),
37 listOf(-156.09375, 17.811456),
38 listOf(-161.323242, 22.512557)
39 )
40 )
41 )
42 )
43 .append("path", "address.location")
44 )
45 )
46 )
47 .append(
48 "should", listOf(
49 Document(
50 "text",
51 Document("path", "property_type")
52 .append("query", "Condominium")
53 )
54 )
55 )
56 )
57 )
58
59 // run pipeline and print results
60 val resultsFlow = collection.aggregate<Document>(
61 listOf(
62 agg,
63 limit(10),
64 project(fields(
65 excludeId(),
66 include("name", "address", "property_type"),
67 computed("score", Document("\$meta", "searchScore"))
68 ))
69 )
70 )
71 resultsFlow.collect { println(it) }
72 }
73 mongoClient.close()
74}
Document{{name=Ocean View Waikiki Marina w/prkg, property_type=Condominium, address=Document{{street=Honolulu, HI, United States, suburb=Oʻahu, government_area=Primary Urban Center, market=Oahu, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-157.83919, 21.28634], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!, property_type=Condominium, address=Document{{street=Lahaina, HI, United States, suburb=Maui, government_area=Lahaina, market=Maui, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-156.68012, 20.96996], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=Makaha Valley Paradise with OceanView, property_type=Condominium, address=Document{{street=Waianae, HI, United States, suburb=Leeward Side, government_area=Waianae, market=Oahu, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-158.20291, 21.4818], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=March 2019 availability! Oceanview on Sugar Beach!, property_type=Condominium, address=Document{{street=Kihei, HI, United States, suburb=Maui, government_area=Kihei-Makena, market=Maui, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-156.46881, 20.78621], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=Tropical Jungle Oasis, property_type=Condominium, address=Document{{street=Hilo, HI, United States, suburb=Island of Hawaiʻi, government_area=South Hilo, market=The Big Island, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-155.09259, 19.73108], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=2 Bdrm/2 Bath Family Suite Ocean View, property_type=Condominium, address=Document{{street=Honolulu, HI, United States, suburb=Waikiki, government_area=Primary Urban Center, market=Oahu, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-157.82696, 21.27971], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=302 Kanai A Nalu Ocean front/view, property_type=Condominium, address=Document{{street=Wailuku, HI, United States, suburb=Maui, government_area=Kihei-Makena, market=Maui, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-156.5039, 20.79664], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=Sugar Beach Resort 1BR Ground Floor Condo !, property_type=Condominium, address=Document{{street=Kihei, HI, United States, suburb=Maui, government_area=Kihei-Makena, market=Maui, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-156.46697, 20.78484], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=2 BR Oceanview - Great Location!, property_type=Condominium, address=Document{{street=Kihei, HI, United States, suburb=Kihei/Wailea, government_area=Kihei-Makena, market=Maui, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-156.44917, 20.73013], is_location_exact=true}}}}, score=2.238388776779175}}
Document{{name=PALMS AT WAILEA #905-2BR-REMODELED-LARGE LANAI-AC, property_type=Condominium, address=Document{{street=Kihei, HI, United States, suburb=Maui, government_area=Kihei-Makena, market=Maui, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-156.4409, 20.69735], is_location_exact=true}}}}, score=2.238388776779175}}

O seguinte exemplo de código:

  • Importa mongodb, o driver do Node.js da MongoDB.

  • Cria uma instância da classe MongoClient para estabelecer uma conexão com seu cluster.

  • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

1const { MongoClient } = require("mongodb");
2
3// connect to your Atlas cluster
4const uri ="<connection-string>";
5
6const client = new MongoClient(uri);
7
8async function run() {
9 try {
10 await client.connect();
11
12 // set namespace
13 const database = client.db("sample_airbnb");
14 const coll = database.collection("listingsAndReviews");
15
16 // define pipeline
17 const agg = [
18 {
19 '$search': {
20 'index': '<INDEX-NAME>',
21 'compound': {
22 'must': [
23 {
24 'geoWithin': {
25 'geometry': {
26 'type': 'Polygon',
27 'coordinates': [
28 [
29 [
30 -161.323242, 22.512557
31 ], [
32 -152.446289, 22.065278
33 ], [
34 -156.09375, 17.811456
35 ], [
36 -161.323242, 22.512557
37 ]
38 ]
39 ]
40 },
41 'path': 'address.location'
42 }
43 }
44 ],
45 'should': [
46 {
47 'text': {
48 'path': 'property_type',
49 'query': 'Condominium'
50 }
51 }
52 ]
53 }
54 }
55 }, {
56 '$limit': 10
57 }, {
58 '$project': {
59 '_id': 0,
60 'name': 1,
61 'address': 1,
62 'property_type': 1,
63 'score': {
64 '$meta': 'searchScore'
65 }
66 }
67 }
68 ];
69 // run pipeline
70 const result = await coll.aggregate(agg);
71
72 // print results
73 await result.forEach((doc) => console.log(doc));
74 } finally {
75 await client.close();
76 }
77}
78run().catch(console.dir);
{
name: 'Ocean View Waikiki Marina w/prkg',
property_type: 'Condominium',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Oʻahu',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: 'Kailua-Kona, Kona Coast II 2b condo',
property_type: 'Apartment',
address: {
street: 'Kailua-Kona, HI, United States',
suburb: 'Kailua/Kona',
government_area: 'North Kona',
market: 'The Big Island',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: 'LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!',
property_type: 'Condominium',
address: {
street: 'Lahaina, HI, United States',
suburb: 'Maui',
government_area: 'Lahaina',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: 'Makaha Valley Paradise with OceanView',
property_type: 'Condominium',
address: {
street: 'Waianae, HI, United States',
suburb: 'Leeward Side',
government_area: 'Waianae',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: '~Ao Lele~ Flying Cloud',
property_type: 'Treehouse',
address: {
street: 'Volcano, HI, United States',
suburb: 'Island of Hawaiʻi',
government_area: 'Puna',
market: 'The Big Island',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
},
score: 1
}
{
name: 'Private OceanFront - Bathtub Beach. Spacious House',
property_type: 'House',
address: {
street: 'Laie, HI, United States',
suburb: "Ko'olauloa",
government_area: 'Koolauloa',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: 'Banyan Bungalow',
property_type: 'Bungalow',
address: {
street: 'Waialua, HI, United States',
suburb: 'Oʻahu',
government_area: 'North Shore Oahu',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
},
score: 1
}
{
name: 'March 2019 availability! Oceanview on Sugar Beach!',
property_type: 'Condominium',
address: {
street: 'Kihei, HI, United States',
suburb: 'Maui',
government_area: 'Kihei-Makena',
market: 'Maui',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: 'Tropical Jungle Oasis',
property_type: 'Condominium',
address: {
street: 'Hilo, HI, United States',
suburb: 'Island of Hawaiʻi',
government_area: 'South Hilo',
market: 'The Big Island',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
},
score: 1
}
{
name: 'Jubilee By The Sea (Ocean Views)',
property_type: 'House',
address: {
street: 'Kailua-Kona, HI, United States',
suburb: 'Island of Hawaiʻi',
government_area: 'North Kona',
market: 'The Big Island',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
},
score: 1
}

O seguinte exemplo de código:

  • Importa pymongo, o driver Python do MongoDB, e o módulo dns, que é necessário para conectar pymongo a Atlas usando uma string de conexão da lista de sementes de DNS.

  • Cria uma instância da classe MongoClient para estabelecer uma conexão com seu cluster.

    • Usa um estágio composto $search para:

      • Especifique que os resultados must estejam dentro de um Polygon definido por um conjunto de coordinates.

      • Dê preferência aos resultados das propriedades do tipo condominium.

    • Usa um estágio $project para:

      • Excluir todos os campos, exceto name, address e property_type.

      • Adicione uma relevância score a cada documento retornado.

  • Itera sobre o cursor para imprimir os documentos que correspondem à consulta.

1import pymongo
2
3# connect to your Atlas cluster
4client = pymongo.MongoClient('<connection-string>')
5
6# define pipeline
7pipeline = [
8 {
9 '$search': {
10 'index': '<INDEX-NAME>',
11 'compound': {
12 'must': [
13 {
14 'geoWithin': {
15 'geometry': {
16 'type': 'Polygon',
17 'coordinates': [
18 [
19 [
20 -161.323242, 22.512557
21 ], [
22 -152.446289, 22.065278
23 ], [
24 -156.09375, 17.811456
25 ], [
26 -161.323242, 22.512557
27 ]
28 ]
29 ]
30 },
31 'path': 'address.location'
32 }
33 }
34 ],
35 'should': [
36 {
37 'text': {
38 'path': 'property_type',
39 'query': 'Condominium'
40 }
41 }
42 ]
43 }
44 }
45 }, {
46 '$limit': 10
47 }, {
48 '$project': {
49 '_id': 0,
50 'name': 1,
51 'address': 1,
52 'property_type': 1,
53 'score': {
54 '$meta': 'searchScore'
55 }
56 }
57 }
58]
59# run pipeline
60result = client["sample_airbnb"]["listingsAndReviews"].aggregate(pipeline)
61
62# print results
63for i in result:
64 print(i)
{'name': 'Ocean View Waikiki Marina w/prkg', 'property_type': 'Condominium', 'address': {'street': 'Honolulu, HI, United States', 'suburb': 'Oʻahu', 'government_area': 'Primary Urban Center', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-157.83919, 21.28634], 'is_location_exact': True}}, 'score': 1.0}
{'name': 'Kailua-Kona, Kona Coast II 2b condo', 'property_type': 'Apartment', 'address': {'street': 'Kailua-Kona, HI, United States', 'suburb': 'Kailua/Kona', 'government_area': 'North Kona', 'market': 'The Big Island', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-155.96445, 19.5702], 'is_location_exact': True}}, 'score': 1.0}
{'name': 'LAHAINA, MAUI! RESORT/CONDO BEACHFRONT!! SLEEPS 4!', 'property_type': 'Condominium', 'address': {'street': 'Lahaina, HI, United States', 'suburb': 'Maui', 'government_area': 'Lahaina', 'market': 'Maui', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-156.68012, 20.96996], 'is_location_exact': True}}, 'score': 1.0}
{'name': 'Makaha Valley Paradise with OceanView', 'property_type': 'Condominium', 'address': {'street': 'Waianae, HI, United States', 'suburb': 'Leeward Side', 'government_area': 'Waianae', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-158.20291, 21.4818], 'is_location_exact': True}}, 'score': 1.0}
{'name': '~Ao Lele~ Flying Cloud', 'property_type': 'Treehouse', 'address': {'street': 'Volcano, HI, United States', 'suburb': 'Island of Hawaiʻi', 'government_area': 'Puna', 'market': 'The Big Island', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-155.21763, 19.42151], 'is_location_exact': False}}, 'score': 1.0}
{'name': 'Private OceanFront - Bathtub Beach. Spacious House', 'property_type': 'House', 'address': {'street': 'Laie, HI, United States', 'suburb': "Ko'olauloa", 'government_area': 'Koolauloa', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-157.91952, 21.63549], 'is_location_exact': True}}, 'score': 1.0}
{'name': 'Banyan Bungalow', 'property_type': 'Bungalow', 'address': {'street': 'Waialua, HI, United States', 'suburb': 'Oʻahu', 'government_area': 'North Shore Oahu', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-158.1602, 21.57561], 'is_location_exact': False}}, 'score': 1.0}
{'name': 'March 2019 availability! Oceanview on Sugar Beach!', 'property_type': 'Condominium', 'address': {'street': 'Kihei, HI, United States', 'suburb': 'Maui', 'government_area': 'Kihei-Makena', 'market': 'Maui', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-156.46881, 20.78621], 'is_location_exact': True}}, 'score': 1.0}
{'name': 'Tropical Jungle Oasis', 'property_type': 'Condominium', 'address': {'street': 'Hilo, HI, United States', 'suburb': 'Island of Hawaiʻi', 'government_area': 'South Hilo', 'market': 'The Big Island', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-155.09259, 19.73108], 'is_location_exact': True}}, 'score': 1.0}
{'name': 'Jubilee By The Sea (Ocean Views)', 'property_type': 'House', 'address': {'street': 'Kailua-Kona, HI, United States', 'suburb': 'Island of Hawaiʻi', 'government_area': 'North Kona', 'market': 'The Big Island', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-155.97349, 19.61318], 'is_location_exact': False}}, 'score': 1.0}

➤ Use o menu suspenso Selecione seu idioma nesta página para definir o idioma dos exemplos nesta seção.


A consulta do MongoDB Search a seguir usa o operador geoWithin com o campo geometry para procurar propriedades no Havaí. O campo type especifica se a área é um polígono GeoJSON ou MultiPolígono.

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 denominados default em sua query do MongoDB Search. Se o seu índice tiver qualquer outro nome, você deverá especificar o campo index.

{
"$search": {
"geoWithin": {
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[[[-157.8412413882,21.2882235819],
[-157.8607925468,21.2962046205],
[-157.8646640634,21.3077019651],
[-157.862776699,21.320776283],
[-157.8341758705,21.3133826738],
[-157.8349985678,21.3000822569],
[-157.8412413882,21.2882235819]]],
[[[-157.852898124,21.301208833],
[-157.8580050499,21.3050871833],
[-157.8587346108,21.3098050385],
[-157.8508811028,21.3119240258],
[-157.8454308541,21.30396767],
[-157.852898124,21.301208833]]]
]
},
"path": "address.location"
}
}
}
1SCORE: 1 _id: “12906431
2 access: "Porch with a love seat, table and three chairs. Regular trash is a gra…"
3 accommodates: 4
4 address: Object
5 street: "Honolulu, HI, United States"
6 suburb: "Makiki/Lower Punchbowl/Tantalus"
7 government_area: "Primary Urban Center"
8 market: "Oahu"
9 country: "United States"
10 country_code: "US"
11 location: Object
12 type: "Point"
13 coordinates: Array (2)
14 0: -157.84343
15 1: 21.30852
16 is_location_exact: false
17
18SCORE: 1 _id: “15808180
19 access: "We used key-less lock, you can check in anytime after 3pm. You can enj…"
20 accommodates: 3
21 address: Object
22 street: "Honolulu, HI, United States"
23 suburb: "Oʻahu"
24 government_area: "Primary Urban Center"
25 market: "Oahu"
26 country: "United States"
27 country_code: "US"
28 location: Object
29 type: "Point"
30 coordinates: Array (2)
31 0: -157.85228
32 1: 21.31184
33 is_location_exact: true
34
35SCORE: 1 _id: “17663877
36 access: ""
37 accommodates: 1
38 address: Object
39 street: "Honolulu, HI, United States"
40 suburb: "Oʻahu"
41 government_area: "Primary Urban Center"
42 market: "Oahu"
43 country: "United States"
44 country_code: "US"
45 location: Object
46 type: "Point"
47 coordinates: Array (2)
48 0: -157.83889
49 1: 21.29776
50 is_location_exact: false
51
52SCORE: 1 _id: “22148252
53 access: "Access your unit 24 hours a day. \"Great location, save on the resort a…\""
54 accommodates: 6
55 address: Object
56 street: "Honolulu, HI, United States"
57 suburb: "Honolulu"
58 government_area: "Primary Urban Center"
59 market: "Oahu"
60 country: "United States"
61 country_code: "US"
62 location: Object
63 type: "Point"
64 coordinates: Array (2)
65 0: -157.86021
66 1: 21.30823
67 is_location_exact: true
68
69SCORE: 1 _id: “2530337
70 access: "Our family home is upstairs, and we share the entrance gate, but you'l…"
71 accommodates: 2
72 address: Object
73 street: "Honolulu, HI, United States"
74 suburb: "Honolulu"
75 government_area: "Primary Urban Center"
76 market: "Oahu"
77 country: "United States"
78 country_code: "US"
79 location: Object
80 type: "Point"
81 coordinates: Array (2)
82 0: -157.85041
83 1: 21.31008
84 is_location_exact: true
85
86SCORE: 1 _id: “7650220
87 access: "You'll have access to the entire apartment, including the kitchen, the…"
88 accommodates: 6
89 address: Object
90 street: "Honolulu, HI, United States"
91 suburb: "Ala Moana/Kakaako"
92 government_area: "Primary Urban Center"
93 market: "Oahu"
94 country: "United States"
95 country_code: "US"
96 location: Object
97 type: "Point"
98 coordinates: Array (2)
99 0: -157.85062
100 1: 21.30094
101 is_location_exact: true
db.listingsAndReviews.aggregate([
{
"$search": {
"geoWithin": {
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[[[-157.8412413882,21.2882235819],
[-157.8607925468,21.2962046205],
[-157.8646640634,21.3077019651],
[-157.862776699,21.320776283],
[-157.8341758705,21.3133826738],
[-157.8349985678,21.3000822569],
[-157.8412413882,21.2882235819]]],
[[[-157.852898124,21.301208833],
[-157.8580050499,21.3050871833],
[-157.8587346108,21.3098050385],
[-157.8508811028,21.3119240258],
[-157.8454308541,21.30396767],
[-157.852898124,21.301208833]]]
]
},
"path": "address.location"
}
}
},
{
"$limit": 3
},
{
"$project": {
"_id": 0,
"name": 1,
"address": 1
}
}
])
SCORE: 1 _id: “12906431
access: "Porch with a love seat, table and three chairs. Regular trash is a gra…"
accommodates: 4
address: Object
street: "Honolulu, HI, United States"
suburb: "Makiki/Lower Punchbowl/Tantalus"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.84343
1: 21.30852
is_location_exact: false
SCORE: 1 _id: “15808180
access: "We used key-less lock, you can check in anytime after 3pm. You can enj…"
accommodates: 3
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85228
1: 21.31184
is_location_exact: true
SCORE: 1 _id: “17663877
access: ""
accommodates: 1
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.83889
1: 21.29776
is_location_exact: false
SCORE: 1 _id: “22148252
access: "Access your unit 24 hours a day. \"Great location, save on the resort a…\""
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.86021
1: 21.30823
is_location_exact: true
SCORE: 1 _id: “2530337
access: "Our family home is upstairs, and we share the entrance gate, but you'l…"
accommodates: 2
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85041
1: 21.31008
is_location_exact: true
SCORE: 1 _id: “7650220
access: "You'll have access to the entire apartment, including the kitchen, the…"
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Ala Moana/Kakaako"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85062
1: 21.30094
is_location_exact: true

Para aprender como executar as seguintes queries no MongoDB Compass, consulte Definir sua query.

estágio do pipeline
Query

$search

{
"geoWithin": {
"geometry": {
"type": "MultiPolygon",
"coordinates": [
[[[-157.8412413882,21.2882235819],
[-157.8607925468,21.2962046205],
[-157.8646640634,21.3077019651],
[-157.862776699,21.320776283],
[-157.8341758705,21.3133826738],
[-157.8349985678,21.3000822569],
[-157.8412413882,21.2882235819]]],
[[[-157.852898124,21.301208833],
[-157.8580050499,21.3050871833],
[-157.8587346108,21.3098050385],
[-157.8508811028,21.3119240258],
[-157.8454308541,21.30396767],
[-157.852898124,21.301208833]]]
]
},
"path": "address.location"
}
}

$limit

3

$project

{
"_id": 0,
"name": 1,
"address": 1
}
SCORE: 1 _id: “12906431
access: "Porch with a love seat, table and three chairs. Regular trash is a gra…"
accommodates: 4
address: Object
street: "Honolulu, HI, United States"
suburb: "Makiki/Lower Punchbowl/Tantalus"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.84343
1: 21.30852
is_location_exact: false
SCORE: 1 _id: “15808180
access: "We used key-less lock, you can check in anytime after 3pm. You can enj…"
accommodates: 3
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85228
1: 21.31184
is_location_exact: true
SCORE: 1 _id: “17663877
access: ""
accommodates: 1
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.83889
1: 21.29776
is_location_exact: false
SCORE: 1 _id: “22148252
access: "Access your unit 24 hours a day. \"Great location, save on the resort a…\""
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.86021
1: 21.30823
is_location_exact: true
SCORE: 1 _id: “2530337
access: "Our family home is upstairs, and we share the entrance gate, but you'l…"
accommodates: 2
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85041
1: 21.31008
is_location_exact: true
SCORE: 1 _id: “7650220
access: "You'll have access to the entire apartment, including the kitchen, the…"
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Ala Moana/Kakaako"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85062
1: 21.30094
is_location_exact: true
1using MongoDB.Bson;
2using MongoDB.Bson.Serialization.Attributes;
3using MongoDB.Bson.Serialization.Conventions;
4using MongoDB.Driver;
5using MongoDB.Driver.GeoJsonObjectModel;
6using MongoDB.Driver.Search;
7
8public class GeoMultiPolygonQuery
9{
10 private const string MongoConnectionString = "<connection-string>";
11
12 public static void Main(string[] args)
13 {
14 // allow automapping of the camelCase database fields to our PropertyDocument
15 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() };
16 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
17
18 // connect to your Atlas cluster
19 var mongoClient = new MongoClient(MongoConnectionString);
20 var airbnbDatabase = mongoClient.GetDatabase("sample_airbnb");
21 var listingsCollection = airbnbDatabase.GetCollection<PropertyDocument>("listingsAndReviews");
22
23 // define multi-polygon geometry
24 var multiPolygon = new GeoJsonMultiPolygon<GeoJson2DCoordinates>(
25 new GeoJsonMultiPolygonCoordinates<GeoJson2DCoordinates>(
26 new GeoJsonPolygonCoordinates<GeoJson2DCoordinates>[]
27 {
28 new GeoJsonPolygonCoordinates<GeoJson2DCoordinates>(
29 new GeoJsonLinearRingCoordinates<GeoJson2DCoordinates>(
30 new GeoJson2DCoordinates[]
31 {
32 new GeoJson2DCoordinates(-157.8412413882, 21.2882235819),
33 new GeoJson2DCoordinates(-157.8607925468, 21.2962046205),
34 new GeoJson2DCoordinates(-157.8646640634, 21.3077019651),
35 new GeoJson2DCoordinates(-157.862776699, 21.320776283),
36 new GeoJson2DCoordinates(-157.8341758705, 21.3133826738),
37 new GeoJson2DCoordinates(-157.8349985678, 21.3000822569),
38 new GeoJson2DCoordinates(-157.8412413882, 21.2882235819)
39 })),
40 new GeoJsonPolygonCoordinates<GeoJson2DCoordinates>(
41 new GeoJsonLinearRingCoordinates<GeoJson2DCoordinates>(
42 new GeoJson2DCoordinates[]
43 {
44 new GeoJson2DCoordinates(-157.852898124, 21.301208833),
45 new GeoJson2DCoordinates(-157.8580050499, 21.3050871833),
46 new GeoJson2DCoordinates(-157.8587346108, 21.3098050385),
47 new GeoJson2DCoordinates(-157.8508811028, 21.3119240258),
48 new GeoJson2DCoordinates(-157.8454308541, 21.30396767),
49 new GeoJson2DCoordinates(-157.852898124, 21.301208833)
50 }))
51 }));
52
53 // define and run pipeline
54 var results = listingsCollection.Aggregate()
55 .Search(Builders<PropertyDocument>.Search.GeoWithin(
56 property => property.Address!.Location,
57 multiPolygon
58 ))
59 .Limit(3)
60 .Project<PropertyDocument>(Builders<PropertyDocument>.Projection
61 .Include(property => property.Name)
62 .Include(property => property.Address)
63 .Exclude(property => property.Id))
64 .ToList();
65
66 // print results
67 foreach (var property in results)
68 {
69 Console.WriteLine(property.ToJson());
70 }
71 }
72}
73
74[BsonIgnoreExtraElements]
75public class PropertyDocument
76{
77 [BsonIgnoreIfDefault]
78 public ObjectId Id { get; set; }
79 public string? Name { get; set; }
80 public AddressDocument? Address { get; set; }
81}
82
83[BsonIgnoreExtraElements]
84public class AddressDocument
85{
86 public GeoJsonPoint<GeoJson2DCoordinates>? Location { get; set; }
87 public string? Street { get; set; }
88 public string? Country { get; set; }
89}
SCORE: 1 _id: “12906431
access: "Porch with a love seat, table and three chairs. Regular trash is a gra…"
accommodates: 4
address: Object
street: "Honolulu, HI, United States"
suburb: "Makiki/Lower Punchbowl/Tantalus"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.84343
1: 21.30852
is_location_exact: false
SCORE: 1 _id: “15808180
access: "We used key-less lock, you can check in anytime after 3pm. You can enj…"
accommodates: 3
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85228
1: 21.31184
is_location_exact: true
SCORE: 1 _id: “17663877
access: ""
accommodates: 1
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.83889
1: 21.29776
is_location_exact: false
SCORE: 1 _id: “22148252
access: "Access your unit 24 hours a day. \"Great location, save on the resort a…\""
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.86021
1: 21.30823
is_location_exact: true
SCORE: 1 _id: “2530337
access: "Our family home is upstairs, and we share the entrance gate, but you'l…"
accommodates: 2
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85041
1: 21.31008
is_location_exact: true
SCORE: 1 _id: “7650220
access: "You'll have access to the entire apartment, including the kitchen, the…"
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Ala Moana/Kakaako"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85062
1: 21.30094
is_location_exact: true
1package main
2
3import (
4 "context"
5 "encoding/json"
6 "fmt"
7 "time"
8
9 "go.mongodb.org/mongo-driver/v2/bson"
10 "go.mongodb.org/mongo-driver/v2/mongo"
11 "go.mongodb.org/mongo-driver/v2/mongo/options"
12)
13
14// define structure of listingsAndReviews collection
15type Property struct {
16 Name string `bson:"name" json:"name"`
17 Address struct {
18 Location struct {
19 Type string `bson:"type" json:"type"`
20 Coordinates []float64 `bson:"coordinates" json:"coordinates"`
21 } `bson:"location" json:"location"`
22 Street string `bson:"street" json:"street"`
23 Country string `bson:"country" json:"country"`
24 } `bson:"address" json:"address"`
25}
26
27func main() {
28 var err error
29 // connect to the Atlas cluster
30 ctx := context.Background()
31 client, err := mongo.Connect(options.Client().SetTimeout(5*time.Second).ApplyURI("<connection-string>"))
32 if err != nil {
33 panic(err)
34 }
35 defer client.Disconnect(ctx)
36 // set namespace
37 collection := client.Database("sample_airbnb").Collection("listingsAndReviews")
38 // define pipeline
39 searchStage := bson.D{{Key: "$search", Value: bson.M{
40 "geoWithin": bson.M{
41 "geometry": bson.M{
42 "type": "MultiPolygon",
43 "coordinates": []interface{}{
44 []interface{}{
45 []interface{}{
46 []float64{-157.8412413882, 21.2882235819},
47 []float64{-157.8607925468, 21.2962046205},
48 []float64{-157.8646640634, 21.3077019651},
49 []float64{-157.862776699, 21.320776283},
50 []float64{-157.8341758705, 21.3133826738},
51 []float64{-157.8349985678, 21.3000822569},
52 []float64{-157.8412413882, 21.2882235819},
53 },
54 },
55 []interface{}{
56 []interface{}{
57 []float64{-157.852898124, 21.301208833},
58 []float64{-157.8580050499, 21.3050871833},
59 []float64{-157.8587346108, 21.3098050385},
60 []float64{-157.8508811028, 21.3119240258},
61 []float64{-157.8454308541, 21.30396767},
62 []float64{-157.852898124, 21.301208833},
63 },
64 },
65 },
66 },
67 "path": "address.location",
68 },
69 }}}
70 limitStage := bson.D{{Key: "$limit", Value: 3}}
71 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "_id", Value: 0}, {Key: "name", Value: 1}, {Key: "address", Value: 1}}}}
72 // run pipeline
73 cursor, err := collection.Aggregate(ctx, mongo.Pipeline{searchStage, limitStage, projectStage})
74 if err != nil {
75 panic(err)
76 }
77 // print results
78 var results []Property
79 if err = cursor.All(context.TODO(), &results); err != nil {
80 panic(err)
81 }
82
83 // Convert results to JSON and print
84 jsonResults, err := json.MarshalIndent(results, "", " ")
85 if err != nil {
86 panic(err)
87 }
88 fmt.Println(string(jsonResults))
89}
[
{
"name": "Heart of Honolulu, 2BD gem! Free Garage Parking!",
"address": {
"location": {
"type": "Point",
"coordinates": [
-157.84343,
21.30852
]
},
"street": "Honolulu, HI, United States",
"country": "United States"
}
},
{
"name": "Private Studio closed to town w/ compact parking",
"address": {
"location": {
"type": "Point",
"coordinates": [
-157.85228,
21.31184
]
},
"street": "Honolulu, HI, United States",
"country": "United States"
}
},
{
"name": "Comfortable Room (2) at Affordable Rates",
"address": {
"location": {
"type": "Point",
"coordinates": [
-157.83889,
21.29776
]
},
"street": "Honolulu, HI, United States",
"country": "United States"
}
}
]
1import java.util.Arrays;
2import static com.mongodb.client.model.Aggregates.limit;
3import static com.mongodb.client.model.Aggregates.project;
4import static com.mongodb.client.model.Projections.excludeId;
5import static com.mongodb.client.model.Projections.fields;
6import static com.mongodb.client.model.Projections.include;
7import com.mongodb.client.MongoClient;
8import com.mongodb.client.MongoClients;
9import com.mongodb.client.MongoCollection;
10import com.mongodb.client.MongoDatabase;
11import org.bson.Document;
12
13public class GeoMultiPolygonQuery {
14 public static void main( String[] args ) {
15
16 // define query
17 Document agg = new Document("$search",
18 new Document("geoWithin",
19 new Document("geometry",
20 new Document("type", "MultiPolygon")
21 .append("coordinates", Arrays.asList(
22 Arrays.asList(
23 Arrays.asList(
24 Arrays.asList(-157.8412413882, 21.2882235819),
25 Arrays.asList(-157.8607925468, 21.2962046205),
26 Arrays.asList(-157.8646640634, 21.3077019651),
27 Arrays.asList(-157.862776699, 21.320776283),
28 Arrays.asList(-157.8341758705, 21.3133826738),
29 Arrays.asList(-157.8349985678, 21.3000822569),
30 Arrays.asList(-157.8412413882, 21.2882235819)
31 )
32 ),
33 Arrays.asList(
34 Arrays.asList(
35 Arrays.asList(-157.852898124, 21.301208833),
36 Arrays.asList(-157.8580050499, 21.3050871833),
37 Arrays.asList(-157.8587346108, 21.3098050385),
38 Arrays.asList(-157.8508811028, 21.3119240258),
39 Arrays.asList(-157.8454308541, 21.30396767),
40 Arrays.asList(-157.852898124, 21.301208833)
41 )
42 )
43 )))
44 .append("path", "address.location")));
45
46 // specify connection
47 String uri = "<connection-string>";
48
49 // establish connection and set namespace
50 try (MongoClient mongoClient = MongoClients.create(uri)) {
51 MongoDatabase database = mongoClient.getDatabase("sample_airbnb");
52 MongoCollection<Document> collection = database.getCollection("listingsAndReviews");
53 // run query and print results
54 collection.aggregate(Arrays.asList(agg,
55 limit(3),
56 project(fields(excludeId(), include("name", "address")))))
57 .forEach(doc -> System.out.println(doc.toJson()));
58 }
59 }
60}
SCORE: 1 _id:12906431
access: "Porch with a love seat, table and three chairs. Regular trash is a gra…"
accommodates: 4
address: Object
street: "Honolulu, HI, United States"
suburb: "Makiki/Lower Punchbowl/Tantalus"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.84343
1: 21.30852
is_location_exact: false
SCORE: 1 _id:15808180
access: "We used key-less lock, you can check in anytime after 3pm. You can enj…"
accommodates: 3
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85228
1: 21.31184
is_location_exact: true
SCORE: 1 _id:17663877
access: ""
accommodates: 1
address: Object
street: "Honolulu, HI, United States"
suburb: "Oʻahu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.83889
1: 21.29776
is_location_exact: false
SCORE: 1 _id:22148252
access: "Access your unit 24 hours a day. \"Great location, save on the resort a…\""
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.86021
1: 21.30823
is_location_exact: true
SCORE: 1 _id:2530337
access: "Our family home is upstairs, and we share the entrance gate, but you'l…"
accommodates: 2
address: Object
street: "Honolulu, HI, United States"
suburb: "Honolulu"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85041
1: 21.31008
is_location_exact: true
SCORE: 1 _id:7650220
access: "You'll have access to the entire apartment, including the kitchen, the…"
accommodates: 6
address: Object
street: "Honolulu, HI, United States"
suburb: "Ala Moana/Kakaako"
government_area: "Primary Urban Center"
market: "Oahu"
country: "United States"
country_code: "US"
location: Object
type: "Point"
coordinates: Array (2)
0: -157.85062
1: 21.30094
is_location_exact: true
1import com.mongodb.client.model.Aggregates.limit
2import com.mongodb.client.model.Aggregates.project
3import com.mongodb.client.model.Projections.*
4import com.mongodb.kotlin.client.coroutine.MongoClient
5import kotlinx.coroutines.runBlocking
6import org.bson.Document
7
8fun main() {
9 // establish connection and set namespace
10 val uri = "<connection-string>"
11 val mongoClient = MongoClient.create(uri)
12 val database = mongoClient.getDatabase("sample_airbnb")
13 val collection = database.getCollection<Document>("listingsAndReviews")
14
15 runBlocking {
16 // define query
17 val agg = Document(
18 "\$search",
19 Document("geoWithin",
20 Document("geometry",
21 Document("type", "MultiPolygon")
22 .append("coordinates", listOf(
23 listOf(
24 listOf(
25 listOf(-157.8412413882, 21.2882235819),
26 listOf(-157.8607925468, 21.2962046205),
27 listOf(-157.8646640634, 21.3077019651),
28 listOf(-157.862776699, 21.320776283),
29 listOf(-157.8341758705, 21.3133826738),
30 listOf(-157.8349985678, 21.3000822569),
31 listOf(-157.8412413882, 21.2882235819)
32 )
33 ),
34 listOf(
35 listOf(
36 listOf(-157.852898124, 21.301208833),
37 listOf(-157.8580050499, 21.3050871833),
38 listOf(-157.8587346108, 21.3098050385),
39 listOf(-157.8508811028, 21.3119240258),
40 listOf(-157.8454308541, 21.30396767),
41 listOf(-157.852898124, 21.301208833)
42 )
43 )
44 )))
45 .append("path", "address.location"))
46 )
47
48 // run query and print results
49 val resultsFlow = collection.aggregate<Document>(
50 listOf(
51 agg,
52 limit(3),
53 project(fields(excludeId(), include("name", "address")))
54 )
55 )
56 resultsFlow.collect { println(it) }
57 }
58 mongoClient.close()
59}
Document{{name=Heart of Honolulu, 2BD gem! Free Garage Parking!, address=Document{{street=Honolulu, HI, United States, suburb=Makiki/Lower Punchbowl/Tantalus, government_area=Primary Urban Center, market=Oahu, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-157.84343, 21.30852], is_location_exact=false}}}}}}
Document{{name=Private Studio closed to town w/ compact parking, address=Document{{street=Honolulu, HI, United States, suburb=Oʻahu, government_area=Primary Urban Center, market=Oahu, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-157.85228, 21.31184], is_location_exact=true}}}}}}
Document{{name=Comfortable Room (2) at Affordable Rates, address=Document{{street=Honolulu, HI, United States, suburb=Oʻahu, government_area=Primary Urban Center, market=Oahu, country=United States, country_code=US, location=Document{{type=Point, coordinates=[-157.83889, 21.29776], is_location_exact=false}}}}}}
1// run-geo-multipolygon-query.js
2
3// establish connection and set namespace
4const { MongoClient } = require("mongodb");
5const uri = "<connection-string>";
6const client = new MongoClient(uri);
7
8async function run() {
9 try {
10 const database = client.db("sample_airbnb");
11 const collection = database.collection("listingsAndReviews");
12
13 // define query
14 const agg = [
15 {
16 "$search": {
17 "geoWithin": {
18 "geometry": {
19 "type": "MultiPolygon",
20 "coordinates": [
21 [
22 [
23 [-157.8412413882, 21.2882235819],
24 [-157.8607925468, 21.2962046205],
25 [-157.8646640634, 21.3077019651],
26 [-157.862776699, 21.320776283],
27 [-157.8341758705, 21.3133826738],
28 [-157.8349985678, 21.3000822569],
29 [-157.8412413882, 21.2882235819]
30 ]
31 ],
32 [
33 [
34 [-157.852898124, 21.301208833],
35 [-157.8580050499, 21.3050871833],
36 [-157.8587346108, 21.3098050385],
37 [-157.8508811028, 21.3119240258],
38 [-157.8454308541, 21.30396767],
39 [-157.852898124, 21.301208833]
40 ]
41 ]
42 ]
43 },
44 "path": "address.location"
45 }
46 }
47 },
48 {
49 "$limit": 3
50 },
51 {
52 "$project": {
53 "_id": 0,
54 "name": 1,
55 "address": 1
56 }
57 }
58 ];
59
60 // run query and print results
61 const result = collection.aggregate(agg);
62 await result.forEach((doc) => console.log(doc));
63 } finally {
64 await client.close();
65 }
66}
67run().catch(console.dir);
{
name: 'Heart of Honolulu, 2BD gem! Free Garage Parking!',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Makiki/Lower Punchbowl/Tantalus',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
}
}
{
name: 'Private Studio closed to town w/ compact parking',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Oʻahu',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: true }
}
}
{
name: 'Comfortable Room (2) at Affordable Rates',
address: {
street: 'Honolulu, HI, United States',
suburb: 'Oʻahu',
government_area: 'Primary Urban Center',
market: 'Oahu',
country: 'United States',
country_code: 'US',
location: { type: 'Point', coordinates: [Array], is_location_exact: false }
}
}
1# run-geo-multipolygon-query.py
2
3# establish connection and set namespace
4import pymongo
5
6client = pymongo.MongoClient("<connection-string>")
7database = client["sample_airbnb"]
8collection = database["listingsAndReviews"]
9
10# define query
11query = [
12 {
13 "$search": {
14 "geoWithin": {
15 "geometry": {
16 "type": "MultiPolygon",
17 "coordinates": [
18 [
19 [
20 [-157.8412413882, 21.2882235819],
21 [-157.8607925468, 21.2962046205],
22 [-157.8646640634, 21.3077019651],
23 [-157.862776699, 21.320776283],
24 [-157.8341758705, 21.3133826738],
25 [-157.8349985678, 21.3000822569],
26 [-157.8412413882, 21.2882235819]
27 ]
28 ],
29 [
30 [
31 [-157.852898124, 21.301208833],
32 [-157.8580050499, 21.3050871833],
33 [-157.8587346108, 21.3098050385],
34 [-157.8508811028, 21.3119240258],
35 [-157.8454308541, 21.30396767],
36 [-157.852898124, 21.301208833]
37 ]
38 ]
39 ]
40 },
41 "path": "address.location"
42 }
43 }
44 },
45 {
46 "$limit": 3
47 },
48 {
49 "$project": {
50 "_id": 0,
51 "name": 1,
52 "address": 1
53 }
54 }
55]
56
57# run query and print results
58results = collection.aggregate(query)
59for document in results:
60 print(document)
{'name': 'Heart of Honolulu, 2BD gem! Free Garage Parking!', 'address': {'street': 'Honolulu, HI, United States', 'suburb': 'Makiki/Lower Punchbowl/Tantalus', 'government_area': 'Primary Urban Center', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-157.84343, 21.30852], 'is_location_exact': False}}}
{'name': 'Private Studio closed to town w/ compact parking', 'address': {'street': 'Honolulu, HI, United States', 'suburb': 'Oʻahu', 'government_area': 'Primary Urban Center', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-157.85228, 21.31184], 'is_location_exact': True}}}
{'name': 'Comfortable Room (2) at Affordable Rates', 'address': {'street': 'Honolulu, HI, United States', 'suburb': 'Oʻahu', 'government_area': 'Primary Urban Center', 'market': 'Oahu', 'country': 'United States', 'country_code': 'US', 'location': {'type': 'Point', 'coordinates': [-157.83889, 21.29776], 'is_location_exact': False}}}

Voltar

geoShape

Nesta página