near Limitaciones del 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 fecha indexados dentro de matrices.
Definición
nearEl operador
nearpermite consultar y puntuar valores numéricos, de fecha y de puntos GeoJSON. Este operador permite realizar búsquedas en:Campos numéricos de tipos de datos BSON
int32,int64ydouble.Campos de fecha del tipo BSON
dateFormatoISODate.Campos de ubicación geográfica definidos mediante coordenadas de latitud y longitud.
Puede usar el operador
nearpara buscar resultados cercanos a un número o una fecha. El operadornearpuntúa los resultados de MongoDB Search según su proximidad al número o la 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 consulta:
Campo | Tipo | Descripción | Necesidad | |||
|---|---|---|---|---|---|---|
| fecha, número o geo | 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í | |||
| cadena o matriz de cadenas | Campo o campos indexados para 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. Puede modificar la puntuación predeterminada con las siguientes opciones:
Para obtener información sobre el uso de Para obtener más información, consulte Comportamiento de puntuación. | no |
Comportamiento de puntuación
La búsqueda de MongoDB score mide la proximidad de los resultados de la búsqueda de MongoDB a origin. El valor de score se escala entre 0 y 1, donde 1 representa una coincidencia exacta y 0 una coincidencia distante. La puntuación es igual a 0.5 cuando la distancia del resultado de la búsqueda de MongoDB a origin es igual a la distancia desde el origen, calculada con pivot.
El operador near utiliza la siguiente función de disminución de 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 punto de referencia para que la puntuación sea igual a | |
| Distancia absoluta entre dónde:
|
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 utilizan la movies colección de la sample_mflix base de datos. El ejemplo de punto GeoJSON utiliza la listingsAndReviews colección de la sample_airbnb base de datos.
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 ha cargado el conjunto de datos de muestra, consulte el tutorial de inicio rápido de búsqueda de MongoDB para crear una definición de índice y ejecutar consultas de búsqueda de MongoDB.
Ejemplo de número
El siguiente ejemplo 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 de la colección movies. La consulta busca documentos en la colección movies con un valor de campo runtime cercano a 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 excepto
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 consulta devuelve los resultados de metadatos para los criterios de búsqueda. Es decir, utiliza la etapa para obtener el número de películas en los siguientes grupos (años) que coinciden con los criterios de $searchMeta búsqueda:
2000, límite inferior inclusivo para este depósito
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 depósito 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 consulta busca películas estrenadas cerca del de septiembre 13 1del. Incluye una etapa para limitar la salida $limit a 3 resultados y una etapa $project para:
Excluir todos los campos excepto
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 de MongoDB anteriores, la película Regeneration recibe una puntuación de 1 porque el valor del campo released de 1915-09-13 coincide exactamente. La película The Cheat, estrenada el 1915-12-13, recibe una puntuación de aproximadamente 0.5 porque la distancia entre el valor del campo released y 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 consultar un objeto de punto GeoJSON de la colección sample_airbnb.listingsAndReviews. La siguiente definición de índice indexa los campos address.location y property_type de 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 utilizan el operador near para consultar 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 excepto
nameyaddressAgregue un campo llamado
score
El score de los resultados se calcula utilizando pivot. Tenga en cuenta que pivot se mide aquí en metros y 1000 metros equivale a 1 kilómetros.
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 consultar los campos property_type y address.location en la colección sample_airbnb.listingsAndReviews.
Ejemplo
La siguiente consulta busca apartamentos en Hong Kong cerca de un punto GeoJSON específico. La consulta utiliza "must" para especificar la condición de búsqueda, que debe cumplirse, y "should" para especificar la preferencia de ubicación. Incluye una etapa para limitar la salida $limit a 3 resultados y una etapa $project para:
Excluir todos los campos excepto
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 }