Docs Menu
Docs Home
/ /

near (Operador de búsqueda de MongoDB)

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.

near

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

  • Campos de fecha del tipo BSON date FormatoISODate.

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

Puede usar el operador near para buscar resultados cercanos a un número o una fecha. El operador near puntúa los resultados de MongoDB Search según su proximidad al número o la 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 consulta:

Campo
Tipo
Descripción
Necesidad

origin

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.

  • 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 con formato ISODate.

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

path

cadena o matriz de cadenas

Campo o campos indexados para 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 su campo indexado está a pivot unidades de origin. El valor de pivot debe ser mayor que 0 (es decir, >).

Si origin es un:

  • Número, pivot se puede especificar como un número entero o 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 es igual a 3,600,000 ms

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

    • 1 mes (o 30 días) es igual 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. Puede modificar la puntuación predeterminada 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.

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

no

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

pivot

Valor especificado como punto de referencia para que la puntuación sea igual a 0.5 si la distancia entre fieldValue y origin es igual a él. Esto define la velocidad con la que la puntuación disminuye a medida que aumenta la distancia entre fieldValue y origin. Para una distancia dada 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 mediante la siguiente fórmula:

abs(fieldValue - origin)

dónde:

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

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

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

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.

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

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

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}

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

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

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