near Limitaciones de operador
No se puede usar el operador near para consultar valores numéricos o de fecha almacenados en una matriz, incluso si se tiene un índice de búsqueda de MongoDB. Se puede usar el
rango solo para consultar valores numéricos o de fechas indexados dentro de arreglos.
Definición
nearEl operador
nearpermite consultar y puntuar valores numéricos, de fecha, y puntos GeoJSON. Este operador puede utilizarse para realizar una búsqueda en:Campos numéricos de los tipos de datos BSON
int32,int64ydouble.Campos de fecha de tipo BSON
dateen FormatoISODate.Campos de ubicación geográfica definidos mediante coordenadas de latitud y longitud.
Se puede usar el operador
nearpara encontrar resultados que estén cerca de un número o una fecha. El operadornearpuntúa los resultados de búsqueda de MongoDB por proximidad al número o fecha.
Sintaxis
near tiene la siguiente sintaxis:
{ $search: { "index": <index name>, // optional, defaults to "default" "near": { "path": "<field-to-search>", "origin": <date-or-number>, "pivot": <pivot-distance>, "score": <score-options> } } }
opciones
near utiliza los siguientes términos para construir una query:
Campo | Tipo | Descripción | Necesidad | |||
|---|---|---|---|---|---|---|
| fecha, número o ubicación geográfica | Número, fecha o punto geográfico cercano al que se realizará la búsqueda. Este es el origen desde el cual se mide la proximidad de los resultados.
| Sí | |||
| string o arreglo de strings | Campo o campos indexados a buscar. | Sí | |||
| Número | Valor que se utiliza para calcular las puntuaciones de los documentos de resultados de búsqueda de MongoDB. La puntuación se calcula mediante la siguiente fórmula: donde Los resultados tienen una puntuación igual a Si
| Sí | |||
| Objeto | Puntuación para asignar a los resultados de búsqueda coincidentes. Puedes modificar la puntuación por defecto usando las siguientes opciones:
Para obtener información sobre cómo usar Para obtener más información, consulta Comportamiento de puntuación. | no |
Comportamiento de la puntuación
MongoDB Search score es una medida de la proximidad de los resultados de MongoDB Search a origin. El score se escala entre 0 y 1, donde 1 es una coincidencia exacta y 0 es una coincidencia lejana. La puntuación es igual a 0.5 cuando la distancia del resultado de búsqueda en MongoDB Search desde origin es igual a la distancia desde el origen según lo calculado utilizando pivot.
El operador near utiliza la siguiente función de decaimiento de la distancia para calcular la puntuación del documento:
pivot score = ------------------ pivot + distance
donde cada término se define de la siguiente manera:
Factor | Descripción | |
|---|---|---|
| Valor especificado como un punto de referencia para igualar la puntuación a | |
| Distancia absoluta entre donde:
|
Puedes modificar la puntuación por defecto usando la opción score en tu query. Para conocer más sobre las opciones, Modificar la puntuación.
Ejemplos
Los ejemplos de número y fecha usan la colección movies en la base de datos sample_mflix. El ejemplo de punto GeoJSON utiliza la colección listingsAndReviews en la base de datos sample_airbnb.
Si cargas los datos de muestra en tu clúster, puedes crear los índices estáticos usando las definiciones de índices en los ejemplos siguientes o el índice dinámico y ejecutar las consultas de ejemplo en tu clúster.
Tip
Si ya has cargado el conjunto de datos de muestra, consulta el tutorial MongoDB Search Quick Start para crear una definición de índice y ejecutar consultas MongoDB Search.
Ejemplo de número
En el siguiente ejemplo se utiliza el operador near para consultar un campo numérico. Las siguientes consultas utilizan un índice llamado runtimes que indexa dinámicamente todos los campos en la colección movies. La query busca documentos en la colección movies con un valor de campo runtime que esté cerca de 279.
Ejemplo básico
La siguiente consulta devuelve todos los documentos que coinciden con los criterios de búsqueda. Incluye una etapa para limitar la salida $limit a 7 resultados y una etapa $project para:
Excluir todos los campos salvo
titleyruntimeAgregue un campo llamado
score
El score se calcula utilizando pivot.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "runtimes", 5 "near": { 6 "path": "year", 7 "origin": 2000, 8 "pivot": 2 9 } 10 } 11 }, 12 { 13 $limit: 7 14 }, 15 { 16 $project: { 17 "_id": 0, 18 "title": 1, 19 "runtime": 1, 20 score: { $meta: "searchScore" } 21 } 22 } 23 ])
[ { runtime: 279, title: 'The Kingdom', score: 1 }, { runtime: 279, title: 'The Kingdom', score: 1 }, { runtime: 279, title: 'The Jinx: The Life and Deaths of Robert Durst', score: 1 }, { runtime: 281, title: 'Les Misèrables', score: 0.5 }, { runtime: 277, title: 'Tokyo Trial', score: 0.5 }, { runtime: 283, title: 'Scenes from a Marriage', score: 0.3333333432674408 }, { runtime: 274, title: 'The Crimson Petal and the White', score: 0.2857142984867096 } ]
En los resultados de búsqueda de MongoDB, las películas The Kingdom y The
Jinx: The Life and Deaths of Robert Durst reciben una puntuación de 1.0 porque el valor de su campo runtime es 279 y coincide exactamente. Las películas Les Misèrables y Tokyo Trial reciben una puntuación de 0.5 porque el valor de su campo runtime está a 2 unidades de 279.
Ejemplo de metadatos
La siguiente query devuelve los resultados de los metadatos para los criterios de búsqueda. Es decir, usa la etapa $searchMeta para obtener el número de películas en los siguientes intervalos (años) que coincidan con los criterios de búsqueda:
2000, límite inferior inclusivo para este intervalo
2005, límite superior exclusivo para el cubo 2000 y límite inferior inclusivo para este cubo
2010, límite superior exclusivo para el cubo 2005 y límite inferior inclusivo para este cubo
2010, límite superior exclusivo para el intervalo 2010
1 db.movies.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "near": { 7 "path": "runtime", 8 "origin": 279, 9 "pivot": 2 10 } 11 }, 12 "facets": { 13 "yearFacet": { 14 "type": "number", 15 "path": "year", 16 "boundaries": [2000, 2005, 2010, 2015 ] 17 } 18 } 19 } 20 } 21 } 22 ])
[ { count: { lowerBound: Long('20910') }, facet: { yearFacet: { buckets: [ { _id: 2000, count: Long('3058') }, { _id: 2005, count: Long('4012') }, { _id: 2010, count: Long('4669') } ] } } } ]
Ejemplo de fecha
El siguiente ejemplo utiliza el operador near para consultar un campo de fecha.
Ejemplo
La siguiente definición de índice llamada releaseddate indexa los valores del campo released en la colección movies:
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "released": { 6 "type": "date" 7 } 8 } 9 } 10 }
La siguiente query busca películas estrenadas cerca de septiembre de 13, 1. Incluye una etapa $limit para limitar los resultados a 3 y una etapa $project para:
Excluir todos los campos salvo
titleyreleasedAgregue un campo llamado
score
La score de los resultados se calcula utilizando pivot.
Nota
pivot se mide aquí en milisegundos, y 7,776,000,000 ms equivale aproximadamente a tres meses.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "releaseddate", 5 "near": { 6 "path": "released", 7 "origin": ISODate("1915-09-13T00:00:00.000+00:00"), 8 "pivot": 7776000000 9 } 10 } 11 }, 12 { 13 $limit: 3 14 }, 15 { 16 $project: { 17 "_id": 0, 18 "title": 1, 19 "released": 1, 20 score: { $meta: "searchScore" } 21 } 22 } 23 ])
La consulta anterior devuelve los siguientes resultados de búsqueda:
{ "title" : "Regeneration", "released" : ISODate("1915-09-13T00:00:00Z"), "score" : 1 } { "title" : "The Cheat", "released" : ISODate("1915-12-13T00:00:00Z"), "score" : 0.49723756313323975 } { "title" : "Hell's Hinges", "released" : ISODate("1916-03-05T00:00:00Z"), "score" : 0.34090909361839294 }
En los resultados de búsqueda anteriores de MongoDB Search, la película Regeneration recibe una puntuación de 1 porque el valor released del campo 1915-09-13 es una coincidencia exacta. La película The Cheat, que se estrenó el 1915-12-13, recibe una puntuación aproximada de 0.5 porque la distancia del valor del campo released desde origin es de aproximadamente 7,776,000,000 milisegundos desde 1915-09-13.
Ejemplos de puntos GeoJSON
Los siguientes ejemplos utilizan el operador near para query un objeto punto GeoJSON en la colección sample_airbnb.listingsAndReviews. La siguiente definición de índice indexa los campos address.location y property_type en la colección listingsAndReviews.
Ejemplo
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": "string" 14 } 15 } 16 } 17 }
Ejemplo básico
Los siguientes ejemplos usan el operador near para query el campo address.location en la colección sample_airbnb.listingsAndReviews.
Ejemplo
La siguiente query busca propiedades en Portugal. Incluye una etapa $limit para limitar la salida a 3 resultados y una etapa $project para:
Excluir todos los campos salvo
nameyaddressAgregue un campo llamado
score
El score de los resultados se calcula utilizando pivot. Ten en cuenta que pivot se mide aquí en metros y 1000 metros equivalen a 1 kilómetro.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "near": { 5 "origin": { 6 "type": "Point", 7 "coordinates": [-8.61308, 41.1413] 8 }, 9 "pivot": 1000, 10 "path": "address.location" 11 } 12 } 13 }, 14 { 15 $limit: 3 16 }, 17 { 18 $project: { 19 "_id": 0, 20 "name": 1, 21 "address": 1, 22 score: { $meta: "searchScore" } 23 } 24 } 25 ])
La consulta anterior devuelve los siguientes resultados de búsqueda:
1 { 2 "name" : "Ribeira Charming Duplex", 3 "address" : { 4 "street" : "Porto, Porto, Portugal", 5 "suburb" : "", 6 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 7 "market" : "Porto", 8 "country" : "Portugal", 9 "country_code" : "PT", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ -8.61308, 41.1413 ], 13 "is_location_exact" : false 14 } 15 }, 16 "score" : 1 17 } 18 { 19 "name" : "DB RIBEIRA - Grey Apartment", 20 "address" : { 21 "street" : "Porto, Porto, Portugal", 22 "suburb" : "", 23 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 24 "market" : "Porto", 25 "country" : "Portugal", 26 "country_code" : "PT", 27 "location" : { 28 "type" : "Point", 29 "coordinates" : [ -8.61294, 41.14126 ], 30 "is_location_exact" : true 31 } 32 }, 33 "score" : 0.9876177310943604 34 } 35 { 36 "name" : "Ribeira 24 (4)", 37 "address" : { 38 "street" : "Porto, Porto, Portugal", 39 "suburb" : "", 40 "government_area" : "Cedofeita, Ildefonso, Sé, Miragaia, Nicolau, Vitória", 41 "market" : "Porto", 42 "country" : "Portugal", 43 "country_code" : "PT", 44 "location" : { 45 "type" : "Point", 46 "coordinates" : [ -8.61318, 41.14107 ], 47 "is_location_exact" : false 48 } 49 }, 50 "score" : 0.973789632320404 51 }
Los resultados muestran que las propiedades que están más lejos de las coordenadas especificadas tienen una puntuación más baja.
Ejemplo compuesto
El siguiente ejemplo utiliza el operador compound para query los campos property_type y address.location en la colección sample_airbnb.listingsAndReviews.
Ejemplo
La siguiente query busca apartamentos en Hong Kong cerca de un punto GeoJSON especificado. La query utiliza must para especificar la condición de búsqueda, que debe cumplirse, y should para indicar la preferencia de ubicación. Incluye una etapa $limit para limitar la salida a 3 resultados y una etapa $project para:
Excluir todos los campos salvo
property_typeyaddressAgregue un campo llamado
score
El score se calcula utilizando el campo pivot. Tenga en cuenta que pivot se mide aquí en metros y 1000 metros equivalen a 1 kilómetro.
1 db.listingsAndReviews.aggregate([ 2 { 3 $search: { 4 "compound": { 5 "must": { 6 "text": { 7 "query": "Apartment", 8 "path": "property_type" 9 } 10 }, 11 "should": { 12 "near": { 13 "origin": { 14 "type": "Point", 15 "coordinates": [114.15027, 22.28158] 16 }, 17 "pivot": 1000, 18 "path": "address.location" 19 } 20 } 21 } 22 } 23 }, 24 { 25 $limit: 3 26 }, 27 { 28 $project: { 29 "_id": 0, 30 "property_type": 1, 31 "address": 1, 32 score: { $meta: "searchScore" } 33 } 34 } 35 ])
La consulta anterior devuelve los siguientes resultados de búsqueda:
1 { 2 "property_type" : "Apartment", 3 "address" : { 4 "street" : "Hong Kong, Hong Kong Island, Hong Kong", 5 "suburb" : "Central & Western District", 6 "government_area" : "Central & Western", 7 "market" : "Hong Kong", 8 "country" : "Hong Kong", 9 "country_code" : "HK", 10 "location" : { 11 "type" : "Point", 12 "coordinates" : [ 114.15027, 22.28158 ], 13 "is_location_exact" : true 14 } 15 }, 16 "score" : 1.177286982536316 17 } 18 { 19 "property_type" : "Apartment", 20 "address" : { 21 "street" : "Hong Kong, Hong Kong Island, Hong Kong", 22 "suburb" : "Central & Western District", 23 "government_area" : "Central & Western", 24 "market" : "Hong Kong", 25 "country" : "Hong Kong", 26 "country_code" : "HK", 27 "location" : { 28 "type" : "Point", 29 "coordinates" : [ 114.15082, 22.28161 ], 30 "is_location_exact" : true 31 } 32 }, 33 "score" : 1.1236450672149658 34 } 35 { 36 "property_type" : "Apartment", 37 "address" : { 38 "street" : "Hong Kong, 39 Hong Kong Island, Hong Kong", 40 "suburb" : "Mid-Levels", 41 "government_area" : "Central & Western", 42 "market" : "Hong Kong", 43 "country" : "Hong Kong", 44 "country_code" : "HK", 45 "location" : { 46 "type" : "Point", 47 "coordinates" : [ 114.15007, 22.28215 ], 48 "is_location_exact" : true 49 } 50 }, 51 "score" : 1.114811897277832 52 }