Definición
rangeEl operador
rangeadmite la búsqueda y puntuación de valores numéricos, de fecha y de string. Puede utilizar este operador para encontrar resultados que se encuentren dentro de un rango numérico, de fecha, objectId o de letras (del alfabeto inglés) determinado.rangesoporta la consulta de los siguientes tipos de datos:número, incluyendo
int32,int64ydouble
Sintaxis
range tiene la siguiente sintaxis:
1 { 2 "$search": { 3 "index": <index name>, // optional, defaults to "default" 4 "range": { 5 "path": "<field-to-search>", 6 "gt | gte": <value-to-search>, 7 "lt | lte": <value-to-search>, 8 "score": <score-options>, 9 "doesNotAffect": "<facet-to-exclude>" | [<array-of-facets>] 10 } 11 } 12 }
opciones
range utiliza los siguientes términos para construir una query:
Campo | Tipo | Descripción | Necesidad |
|---|---|---|---|
| fecha, número o string BSON, o ObjectId | Encontrar valores mayores que (
| no |
| fecha, número o string BSON, o ObjectId | Encuentra valores menores que (
| no |
| string o arreglo de strings | Campo o campos indexados a buscar. | Sí |
| Objeto | Modifica la puntuación asignada a los resultados de búsqueda coincidentes. Puedes modificar la puntuación por defecto utilizando las siguientes opciones:
Cuando se consultan valores en arreglos, MongoDB Search asigna mayores puntuaciones si más valores en el arreglo coinciden con la query. Para obtener información sobre cómo usar | no |
| string o arreglo de strings | Faceta o lista de facetas que se deben excluir del recálculo del recuento en función de esta query. El valor debe ser uno o más nombres de una faceta definida en | no |
Ejemplos
Los siguientes ejemplos utilizan la colección en los datos de muestra. Si cargaste los datos de ejemplo en tu clúster, puedes crear los índices utilizando las definiciones de índices en los ejemplos siguientes y ejecutar las consultas de ejemplo en tu clúster.
Ejemplo de número
Los siguientes ejemplos utilizan índices en campos numéricos de los datos de muestra y ejecutan queries range en los campos indexados.
En este ejemplo, puedes utilizar asignaciones estáticas o dinámicas para indexar el campo runtime en la colección sample_mflix.movies. La query utiliza los campos gte y lte para definir el rango numérico de búsqueda.
Índice de muestra
La siguiente definición de índice denominada default indexa todos los campos en la colección movies.
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
La siguiente definición de índice llamada default indexa el campo runtime solo en la colección movies.
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
Query de muestra
La siguiente query busca películas con una duración mayor o igual a 2 y menor o igual a 3. Incluye una etapa $limit para limitar la salida a 5 resultados y una etapa $project para excluir todos los campos excepto title y runtime.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "runtime", 6 "gte": 2, 7 "lte": 3 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "runtime": 1 19 } 20 } 21 ])
{ "runtime" : 3, "title" : "Dots" } { "runtime" : 3, "title" : "Sisyphus" } { "runtime" : 3, "title" : "The Fly" } { "runtime" : 2, "title" : "Andrè and Wally B." } { "runtime" : 2, "title" : "Luxo Jr." }
Para este ejemplo, puede usar asignaciones estáticas o dinámicas para indexar el campo runtime en la colección sample_mflix.movies. La query utiliza el campo lte para buscar todos los valores menores o iguales al valor dado.
Índice de muestra
La siguiente definición de índice con nombre default indexa el campo runtime en la colección movies.
1 { 2 "mappings": { 3 "dynamic": true 4 } 5 }
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "runtime": { 6 "type": "number" 7 } 8 } 9 } 10 }
Query de muestra
La siguiente query busca todas las películas con una duración inferior o igual a 2. Incluye una etapa $limit para limitar la salida a 5 resultados y una etapa $project para:
Excluir todos los campos salvo
titleyruntimeAñade un campo llamado
score
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "runtime", 6 "lte": 2 7 } 8 } 9 }, 10 { 11 "$limit": 5 12 }, 13 { 14 "$project": { 15 "_id": 0, 16 "title": 1, 17 "runtime": 1, 18 score: { $meta: "searchScore" } 19 } 20 } 21 ])
{ "runtime" : 1, "title" : "Blacksmith Scene", "score" : 1 } { "runtime" : 2, "title" : "Andrè and Wally B.", "score" : 1 } { "runtime" : 2, "title" : "Luxo Jr.", "score" : 1 } { "runtime" : 1, "title" : "The Kiss", "score" : 1 } { "runtime" : 1, "title" : "Dickson Experimental Sound Film", "score" : 1 }
El siguiente ejemplo indexa de forma dinámica todos los campos indexables de forma dinámica, incluidos aquellos con arreglos de valores numéricos, en la colección sample_analytics.customers. La query de muestra utiliza los campos gte y lte para buscar todos los valores entre los valores dados en un arreglo de valores numéricos.
Índice de muestra
La siguiente definición de índice denominada default indexa dinámicamente todos los campos, incluido el campo accounts, que es un arreglo de valores numéricos.
{ "mappings": { "dynamic": true } }
Query de muestra
La siguiente query busca cuentas de clientes entre 250000 y 300000. Incluye una etapa $limit para limitar la salida a 5 resultados y una etapa $project para excluir todos los campos, excepto accounts y name.
1 db.customers.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "accounts", 6 "gt": 250000, 7 "lt": 400000 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "accounts": 1, 18 "name": 1 19 } 20 } 21 ])
1 [ 2 { 3 name: 'Elizabeth Ray', 4 accounts: [ 371138, 324287, 276528, 332179, 422649, 387979 ] 5 }, 6 { 7 name: 'Katherine David', 8 accounts: [ 462501, 228290, 968786, 515844, 377292 ] 9 }, 10 { 11 name: 'Brad Cardenas', 12 accounts: [ 721914, 817222, 973067, 260799, 87389 ] 13 }, 14 { 15 name: 'Gary Nichols', 16 accounts: [ 385397, 337979, 325377, 440243, 586395, 86702 ] 17 }, 18 { name: 'Jennifer Lawrence', accounts: [ 344885, 839927, 853542 ] } 19 ]
Ejemplo de fecha
El siguiente ejemplo utiliza el operador range para hacer queries a un campo de fecha en la colección sample_mflix.movies. En este ejemplo, se pueden utilizar asignaciones estáticas o dinámicas para indexar el campo de tipo date denominado released en la colección.
Índice de muestra
La siguiente definición de índice llamada default indexa todos los campos dinámicamente indexables de la colección movies, incluido el campo released, que es de tipo date.
{ "mappings": { "dynamic": true } }
La siguiente definición de índice denominada default indexa el campo released en la colección movies:
{ "mappings": { "dynamic": false, "fields": { "released": { "type": "date" } } } }
Query de muestra
La siguiente query busca películas estrenadas entre enero de 1, 2010 y enero de 1, 2015. Incluye una etapa de $limit para limitar los resultados a 5 y una etapa de $project para excluir todos los campos excepto title y released.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "released", 6 "gt": ISODate("2010-01-01T00:00:00.000Z"), 7 "lt": ISODate("2015-01-01T00:00:00.000Z") 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1, 18 "released": 1 19 } 20 } 21 ])
1 [ 2 { 3 title: 'Too Much Johnson', 4 released: ISODate('2014-08-30T00:00:00.000Z') 5 }, 6 { 7 title: 'Stolen Desire', 8 released: ISODate('2012-07-01T00:00:00.000Z') 9 }, 10 { 11 title: 'The Monkey King', 12 released: ISODate('2012-01-12T00:00:00.000Z') 13 }, 14 { title: 'The Land', released: ISODate('2012-08-04T00:00:00.000Z') }, 15 { 16 title: 'My Childhood', 17 released: ISODate('2013-07-31T00:00:00.000Z') 18 } 19 ]
Ejemplo de ObjectId
En el siguiente ejemplo se utiliza el operador range para consultar un campo objectId de la colección sample_mflix.movies. En este ejemplo, puedes utilizar asignaciones estáticas o dinámicas para indexar el campo de tipo objectId denominado _id en la colección.
Índice de muestra
La siguiente definición de índice denominada default indexa todos los campos en la colección movies.
La siguiente definición de índice llamada default indexa todos los campos dinámicamente indexables de la colección movies, incluido el campo _id, que es de tipo objectId.
{ "mappings": { "dynamic": true } }
La siguiente definición de índice denominada default indexa el campo _id en la colección movies:
{ "mappings": { "dynamic": false, "fields": { "_id": { "type": "objectId" } } } }
Query de muestra
El siguiente ejemplo utiliza el operador range para query el campo _id para un rango de valores objectId en la colección sample_mflix.movies.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "_id", 6 "gte": ObjectId("573a1396f29313caabce4a9a"), 7 "lte": ObjectId('573a1396f29313caabce4ae7') 8 } 9 } 10 }, 11 { 12 "$project": { 13 "_id": 1, 14 "title": 1, 15 "released": 1 16 } 17 } 18 ])
1 [ 2 { 3 _id: ObjectId('573a1396f29313caabce4a9a'), 4 title: 'The Godfather', 5 released: ISODate('1972-03-24T00:00:00.000Z') 6 }, 7 { 8 _id: ObjectId('573a1396f29313caabce4a9b'), 9 title: 'Get to Know Your Rabbit', 10 released: ISODate('1972-06-01T00:00:00.000Z') 11 }, 12 { 13 _id: ObjectId('573a1396f29313caabce4aad'), 14 title: 'The Tall Blond Man with One Black Shoe', 15 released: ISODate('1973-08-30T00:00:00.000Z') 16 }, 17 { 18 _id: ObjectId('573a1396f29313caabce4abe'), 19 title: 'The Great Northfield Minnesota Raid', 20 released: ISODate('1972-05-12T00:00:00.000Z') 21 }, 22 { 23 _id: ObjectId('573a1396f29313caabce4ac4'), 24 title: 'The Heartbreak Kid', 25 released: ISODate('1973-02-01T00:00:00.000Z') 26 }, 27 { 28 _id: ObjectId('573a1396f29313caabce4ac7'), 29 title: 'Gumshoe', 30 released: ISODate('1971-12-01T00:00:00.000Z') 31 }, 32 { 33 _id: ObjectId('573a1396f29313caabce4ad9'), 34 title: 'Heat', 35 released: ISODate('1972-10-06T00:00:00.000Z') 36 }, 37 { 38 _id: ObjectId('573a1396f29313caabce4ae7'), 39 title: 'Horror Express', 40 released: ISODate('1973-12-01T00:00:00.000Z') 41 } 42 ]
Ejemplo de string
El siguiente ejemplo utiliza el operador range para consultar un campo de cadena en la colección sample_mflix.movies. Para este ejemplo, debes usar asignaciones estáticas para indexar el campo llamado title en la colección como el tipo MongoDB Search token.
Índice de muestra
La siguiente definición de índice llamada default indexa el campo title en la colección movies como tipo de búsqueda MongoDB Search token:
{ "mappings": { "dynamic": false, "fields": { "title": { "type": "token", "normalizer": "lowercase" } } } }
Query de muestra
La siguiente query busca títulos de películas que contengan caracteres entre city y country. Incluye una etapa $limit para limitar el resultado a 5 resultados y una etapa $project para excluir todos los campos excepto title.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "title", 6 "gt": "city", 7 "lt": "country" 8 } 9 } 10 }, 11 { 12 "$limit": 5 13 }, 14 { 15 "$project": { 16 "_id": 0, 17 "title": 1 18 } 19 } 20 ])
[ { title: 'Civilization' }, { title: 'Clash of the Wolves' }, { title: 'City Lights' }, { title: 'Comradeship' }, { title: 'Come and Get It' } ]
Ejemplo de documentos incrustados
La siguiente query busca en el campo funding_rounds.raised_amount de la colección sample_training.companies valores mayores o iguales a 500000 y menores o iguales a 1000000. Usa el returnStoredSource: true y returnScope para recuperar y devolver los campos dentro del arreglo de objetos funding_rounds, que están almacenados en mongot. La query utiliza el índice de muestra del ejemplo Usar ruta relativa para fuente almacenada.
➤ Prueba esto en el búsqueda Playground. Los resultados en el MongoDB Search Playground pueden variar debido a que los datos en el MongoDB Search Playground son más pequeños que la colección de muestra utilizada en el siguiente ejemplo.
1 db.companies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "funding_rounds.raised_amount", 6 "gte": 500000, 7 "lte": 1000000 8 }, 9 "returnStoredSource": true, 10 "returnScope": { 11 "path": "funding_rounds" 12 } 13 } 14 }, 15 { 16 "$limit": 5 17 } 18 ])
[ { round_code: 'angel', raised_amount: 500000, raised_currency_code: 'USD' }, { round_code: 'angel', raised_amount: 800000, raised_currency_code: 'USD' }, { round_code: 'c', raised_amount: 1000000, raised_currency_code: 'USD' }, { round_code: 'seed', raised_amount: 1000000, raised_currency_code: 'USD' }, { round_code: 'a', raised_amount: 1000000, raised_currency_code: 'USD' } ]
Ejemplo de metadatos
La siguiente query busca películas con una duración mayor o igual a 2 y menor o igual a 3. La query utiliza la etapa $searchMeta para recuperar todas las películas en los siguientes intervalos (años) que cumplen con los criterios de búsqueda:
1990, límite inferior inclusivo para este intervalo
2000, límite superior exclusivo para el cubo 1990 y límite inferior inclusivo para este cubo
2010, límite superior exclusivo para el cubo 2000 y límite inferior inclusivo para este cubo
2020, límite superior exclusivo para el intervalo 2010
La query utiliza un índice llamado default que indexa dinámicamente todos los campos en el namespace sample_mflix.movies.
db.movies.aggregate([ { "$searchMeta": { "facet": { "operator": { "range": { "path": "runtime", "gte": 2, "lte": 3 } }, "facets": { "yearFacet": { "type": "number", "path": "year", "boundaries": [1990, 2000, 2010, 2020 ] } } } } } ])
[ { count: { lowerBound: Long('15') }, facet: { yearFacet: { buckets: [ { _id: 1990, count: Long('2') }, { _id: 2000, count: Long('3') }, { _id: 2010, count: Long('5') } ] } } } ]