Join us at MongoDB.local London on 7 May to unlock new possibilities for your data. Use WEB50 to save 50%.
Register now >
Docs Menu
Docs Home
/ /

near (MongoDB Search 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.

near

El operador near permite 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, int64 y double.

  • Campos de fecha de tipo BSON date en FormatoISODate.

  • Campos de ubicación geográfica definidos mediante coordenadas de latitud y longitud.

Se puede usar el operador near para encontrar resultados que estén cerca de un número o una fecha. El operador near puntúa los resultados de búsqueda de MongoDB por proximidad al número o fecha.

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

near utiliza los siguientes términos para construir una query:

Campo
Tipo
Descripción
Necesidad

origin

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.

  • Para los campos numéricos, el valor debe ser del tipo de datos BSON int32, int64 o double.

  • Para los campos de fecha, el valor debe ser una fecha formateada ISODate.

  • Para campos geo. el valor debe ser un punto GeoJSON.

path

string o arreglo de strings

Campo o campos indexados a buscar.

pivot

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:

pivot
score = ------------------
pivot + distance

donde distance es la diferencia entre origin y el valor del campo indexado.

Los resultados tienen una puntuación igual a 1/2 (o 0.5) cuando el valor de campo indexado está a pivot unidades de origin. El valor de pivot debe ser mayor que (es decir, >) 0.

Si origin es un:

  • El número, pivot puede especificarse como un número entero o como un número de punto flotante.

  • La fecha, pivot debe especificarse en milisegundos y puede especificarse como un entero de 32 o 64 bits. Por ejemplo:

    • 1 minuto es igual a 60,000 ms

    • 1 hora equivale a 3,600,000 ms

    • 1 día es igual a 86,400,000 ms

    • 1 mes (o 30 días) equivale a 2,592,000,000 ms

  • Punto GeoJSON, pivot se mide en metros y debe especificarse como un número entero o de punto flotante.

score

Objeto

Puntuación para asignar a los resultados de búsqueda coincidentes. Puedes modificar la puntuación por defecto usando las siguientes opciones:

  • boostMultiplica la puntuación resultante por el número dado.

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

  • function: reemplaza el resultado de la puntuación con la expresión dada.

Para obtener información sobre cómo usar score en tu query, consulta Calificación de los Documentos en los Resultados.

Para obtener más información, consulta Comportamiento de puntuación.

no

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

pivot

Valor especificado como un punto de referencia para igualar la puntuación a 0.5 si la distancia entre fieldValue y origin es igual a ese valor. Esto define cuán rápido disminuye la puntuación a medida que aumenta la distancia entre fieldValue y origin. Para una distancia determinada entre fieldValue y origin, si pivot disminuye, la puntuación también disminuye.

distance

Distancia absoluta entre fieldValue y origin. MongoDB Search calcula este valor utilizando la siguiente fórmula:

abs(fieldValue - origin)

donde:

  • fieldValue es el valor del campo que estás consultando en el documento.

  • origin es el número, fecha o punto geográfico para buscar cerca de.

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.

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.

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.

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 title y runtime

  • Agregue un campo llamado score

El score se calcula utilizando pivot.

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

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

1db.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') }
]
}
}
}
]

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 title y released

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

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

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}

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 name y address

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

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

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_type y address

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

1db.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}

Volver

morelikethis

En esta página