Docs Menu
Docs Home
/ /

geoWithin Operador

geoWithin

El operador geoWithin permite consultar puntos geográficos dentro de una geometría dada. Solo se devuelven puntos, incluso si el valor indexShapes es true en la definición de índice.

Puedes consultar puntos dentro de:

  • Círculo

  • Cuadro delimitador

  • Polígono

Al especificar las coordenadas de búsqueda, primero se debe especificar la longitud y luego la latitud. Los valores de longitud pueden estar entre -180 y 180, ambos inclusive. Los valores de latitud pueden estar entre -90 y 90, ambos inclusive. Los valores de coordenadas pueden ser enteros o dobles.

Nota

La búsqueda de MongoDB no admite lo siguiente:

  • Sistema de referencia de coordenadas (CRS) no predeterminado

  • Sistema de coordenadas XY planas (2 dimensión)

  • Pares de coordenadas Notación de puntos (es decir, pointFieldName: [12, 34])

geoWithin tiene la siguiente sintaxis:

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

geoWithin utiliza los siguientes términos para construir una consulta:

Campo
Tipo
Descripción
Necesidad

box

Objeto

Objeto que especifica la parte inferior izquierda y superior derecha PuntosGeoJSON de un cuadro para buscar. El objeto acepta los siguientes campos:

Para aprender a especificar datos GeoJSON dentro de un objeto GeoJSON, consulta objetos GeoJSON.

Se requiere box, circle o geometry.

condicional

circle

Objeto

Objeto que especifica el punto central y el radio en metros para la búsqueda. El objeto contiene los siguientes campos GeoJSON:

  • center - Centro del círculo especificado como un punto GeoJSON.

  • radius Radio, que es un número expresado en metros. El valor debe ser mayor o igual a 0.

Para aprender a especificar datos GeoJSON dentro de un objeto GeoJSON, consulta objetos GeoJSON.

Se requiere circle, box o geometry.

condicional

geometry

Objeto GeoJSON

ObjetoGeoJSON que especifica el MultiPolygon o Polígono donde se realizará la búsqueda. El polígono debe especificarse como un bucle cerrado donde la última posición coincida con la primera.

Al calcular resultados geoespaciales, los operadores geoShape y geoWithin de MongoDB Search y el operador $geoIntersects de MongoDB utilizan geometrías diferentes. Esta diferencia se observa en cómo MongoDB Search y MongoDB dibujan los bordes poligonales.

MongoDB Search dibuja polígonos según la distancia cartesiana, que es la línea más corta entre dos puntos en el sistema de referencia de coordenadas.

MongoDB dibuja polígonos utilizando el modo geodésico con 2índices dsphere que están construidos sobre una librería de terceros para tipos geodésicos, o el modo plano, de 2índices d. Para obtener más información, consulte Objetos GeoJSON.

MongoDB Search y MongoDB podrían devolver resultados diferentes para consultas geoespaciales que involucren polígonos.

Para aprender a especificar datos GeoJSON dentro de un objeto GeoJSON, consulta objetos GeoJSON.

Se requiere geometry, box o circle.

condicional

path

cadena o matriz de cadenas

Campo o campos de tipo geo indexados para búsqueda.

score

Objeto

Puntuación para asignar a los resultados de búsqueda coincidentes. Por defecto, la puntuación en los resultados 1 es. Puede modificar la puntuación con las siguientes opciones:

  • boost:multiplica la puntuación del resultado por el número dado.

  • constant:reemplace la puntuación del resultado con el número dado.

  • function:reemplace la puntuación del resultado con la expresión dada.

Para obtener información sobre el uso de score en su consulta,consulte Calificar los documentos en los resultados.

no

Los siguientes ejemplos utilizan la listingsAndReviews colección en la sample_airbnb base de datos. Si tiene el conjunto de datos de ejemplo en su clúster, puede crear un índice de búsqueda de MongoDB personalizado para el tipo geográfico y ejecutar las consultas de ejemplo en su clúster.

Utilice la siguiente definición de índice de muestra para indexar el campo address.location en la colección 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}

➤ Utilice el menú desplegable Seleccione su idioma en esta página para configurar el idioma de los ejemplos en esta sección.


La siguiente consulta utiliza el operador geoWithin con el campo box para buscar propiedades dentro de un cuadro delimitador en Australia.

La query incluye lo siguiente:

  • $limit etapa para limitar la salida a 3 resultados.

  • $project etapa para excluir todos los campos excepto name addressy.

Nota

No es necesario especificar índices llamados default en la consulta de búsqueda de MongoDB. Si el índice tiene otro nombre, debe especificar el campo index.

La siguiente query de MongoDB Search devuelve los documentos que coinciden con los criterios de búsqueda 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 a ejecutar las siguientes consultas en MongoDB Compass, consulte Definir su consulta.

Etapa de tubería
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}}}

La siguiente consulta devuelve el número de tipos de propiedades (como apartamento, casa, etc.) para los criterios de búsqueda 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 a ejecutar las siguientes consultas en MongoDB Compass, consulte Definir su consulta.

Para ejecutar esta consulta en MongoDB Compass:

  1. Haga clic en el Aggregations tab.

  2. Haz clic en Select..., luego configura la siguiente fase de la pipeline seleccionando la etapa en el menú desplegable y agregando la query para esa etapa.

    Etapa de tubería
    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}]}}}

La siguiente consulta utiliza el operador geoWithin con el campo circle para buscar propiedades dentro de un radio de una milla de coordenadas especificadas en Canadá.

La query incluye lo siguiente:

  • Etapa $limit para limitar la salida a resultados 3

  • $project etapa para excluir todos los campos excepto name addressy.

Nota

No es necesario especificar índices llamados default en la consulta de búsqueda de MongoDB. Si el índice tiene otro nombre, debe especificar el campo index.


➤ Utilice el menú desplegable Seleccione su idioma en esta página para configurar el idioma de los ejemplos en esta sección.


{
"$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 a ejecutar las siguientes consultas en MongoDB Compass, consulte Definir su consulta.

Etapa de tubería
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}}}

Los siguientes ejemplos utilizan el geoWithin operador con el geometry campo para buscar propiedades en Hawái. El type campo especifica si el área es un polígono GeoJSON o un multipolígono.

Las consultas incluyen:

  • $limit etapa para limitar la salida a 3 resultados.

  • $project etapa para excluir todos los campos excepto name addressy.

Nota

No es necesario especificar índices llamados default en la consulta de búsqueda de MongoDB. Si el índice tiene otro nombre, debe especificar el campo index.


➤ Utilice el menú desplegable Seleccione su idioma en esta página para configurar el idioma de los ejemplos en esta sección.


La siguiente consulta de búsqueda de MongoDB:

  • Utiliza una etapa compuesta $search para:

    • Especifica que los resultados must estén dentro de un Polygon definido por un conjunto de coordinates.

    • Dar preferencia a los resultados de propiedades de tipo condominium.

  • Utiliza una etapa $project para:

    • Excluir todos los campos excepto name, address y property_type.

    • Añade una relevancia score a cada documento devuelto.

[
{
"$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 a ejecutar las siguientes consultas en MongoDB Compass, consulte Definir su consulta.

Etapa de tubería
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}

El siguiente ejemplo de código:

  • Importa los paquetes y dependencias de mongodb.

  • Establece una conexión con su clúster.

  • Imprime los documentos que coinciden con la consulta de la instancia 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}}

El siguiente ejemplo de código:

  • Importa mongodb, controlador Node.js de MongoDB.

  • Crea una instancia de la clase MongoClient para establecer una conexión a su clúster.

  • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

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
}

El siguiente ejemplo de código:

  • Importa pymongo, el controlador Python de MongoDB y el módulo dns, que es necesario para conectar pymongo a Atlas mediante un Cadena de conexión de la lista de semillas DNS.

  • Crea una instancia de la clase MongoClient para establecer una conexión a su clúster.

    • Utiliza una etapa compuesta $search para:

      • Especifica que los resultados must estén dentro de un Polygon definido por un conjunto de coordinates.

      • Dar preferencia a los resultados de propiedades de tipo condominium.

    • Utiliza una etapa $project para:

      • Excluir todos los campos excepto name, address y property_type.

      • Añade una relevancia score a cada documento devuelto.

  • Itera sobre el cursor para imprimir los documentos que coinciden con el query.

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}

➤ Utilice el menú desplegable Seleccione su idioma en esta página para configurar el idioma de los ejemplos en esta sección.


La siguiente consulta de búsqueda de MongoDB utiliza el geoWithin operador con el geometry campo para buscar propiedades en Hawái. El type campo especifica si el área es un polígono GeoJSON o un multipolígono.

La query incluye lo siguiente:

  • $limit etapa para limitar la salida a 3 resultados.

  • $project etapa para excluir todos los campos excepto name addressy.

Nota

No es necesario especificar índices llamados default en la consulta de búsqueda de MongoDB. Si el índice tiene otro nombre, debe especificar el 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 a ejecutar las siguientes consultas en MongoDB Compass, consulte Definir su consulta.

Etapa de tubería
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}}}

Volver

geoShape

En esta página