Definición
El operador in en MongoDB Search realiza una búsqueda de una matriz de BSON number, date, boolean, objectId, uuid o string en la ruta dada y devuelve los documentos cuyo valor del campo es igual a cualquier valor de la matriz especificada. Si el campo contiene una matriz, el operador in selecciona los documentos cuyo campo contiene una matriz que contiene al menos un elemento que coincide con cualquier valor de la matriz especificada.
Sintaxis
El operador in tiene la siguiente sintaxis:
{ $search: { "index": <index name>, // optional, defaults to "default" "in": { "path": "<field-to-search>", "score": <options>, "value": <single-or-array-of-values-to-search> } } }
Campos
Campo | Tipo | Descripción | Necesidad |
|---|---|---|---|
| string o arreglo de strings | Requerido | |
| Objeto | Puntuación que se asigna a los resultados coincidentes con los términos de búsqueda. Utiliza una de las siguientes opciones para modificar la puntuación:
| Opcional |
| Valor o valores a buscar. El valor puede ser un solo valor o un arreglo de valores, pero solo de uno de los tipos BSON soportados y no puede ser una mezcla de tipos diferentes. Para buscar valores de cadena en un campo, debe indexar el campo como el tipo de token de búsqueda de MongoDB. | Requerido |
Ejemplos
Los siguientes ejemplos utilizan el operador in para consultar colecciones en la colección sample_analytics.customers. Si cargas los datos de muestra en tu clúster y creas un índice de MongoDB Search llamado default que utiliza mapeos estáticos en la colección, puedes ejecutar las siguientes consultas contra las colecciones.
Índice de muestra
La definición del índice de muestra especifica las siguientes acciones para admitir consultas del operador in en los campos indexados de la colección:
Indexe automáticamente todos los campos indexables dinámicos en la colección.
Indexa estáticamente el campo
namecomo el tipo token y convierte el texto del campo en minúsculas.
{ "mappings": { "index": "default", "dynamic": true, "fields": { "name": { "normalizer": "lowercase", "type": "token" } } } }
Para aprender a crear un índice de búsqueda de MongoDB, consulta Administrar índices de búsqueda de MongoDB.
Queries de muestra
La siguiente query utiliza el operador in para buscar en el campo birthdate, que contiene un solo valor, a los clientes que nacieron en determinadas fechas. La query utiliza la etapa $project para:
Omitir el campo
_iden los resultados.Incluye solo los campos
nameybirthdateen los resultados.
1 db.customers.aggregate([ 2 { 3 "$search": { 4 "in": { 5 "path": "birthdate", 6 "value": [ISODate("1977-03-02T02:20:31.000+00:00"), ISODate("1977-03-01T00:00:00.000+00:00"), ISODate("1977-05-06T21:57:35.000+00:00")] 7 } 8 } 9 }, 10 { 11 "$project": { 12 "_id": 0, 13 "name": 1, 14 "birthdate": 1 15 } 16 } 17 ])
1 [ 2 { 3 name: 'Elizabeth Ray', 4 birthdate: ISODate("1977-03-02T02:20:31.000Z") 5 }, 6 { 7 name: 'Brad Cardenas', 8 birthdate: ISODate("1977-05-06T21:57:35.000Z") 9 } 10 ]
MongoDB Search devuelve dos documentos que coinciden con las fechas especificadas en la query.
La siguiente query utiliza el operador in para consultar el campo accounts, que contiene un arreglo de números, para clientes con los números de cuenta 371138, 371139, o 371140. La consulta utiliza la etapa $project para:
Omitir el campo
_iden los resultados.Incluye solo los campos
nameyaccountsen los resultados.
1 db.customers.aggregate([ 2 { 3 "$search": { 4 "in": { 5 "path": "accounts", 6 "value": [371138, 371139, 371140] 7 } 8 } 9 }, 10 { 11 "$project": { 12 "_id": 0, 13 "name": 1, 14 "accounts": 1 15 } 16 } 17 ])
1 [ 2 { 3 name: 'Elizabeth Ray', 4 accounts: [ 371138, 324287, 276528, 332179, 422649, 387979 ] 5 } 6 ]
MongoDB Search sólo devuelve un documento que coincide con el número de cuenta 371138 especificado en la consulta.
La siguiente query utiliza el operador text para buscar clientes cuyo primer nombre es James en el campo name. La query especifica la preferencia utilizando el operador in para los clientes asociados con los IDs de objeto dados en el campo _id. La consulta utiliza la etapa $limit para limitar la salida a 5 resultados y la etapa $project para:
Incluye solo los campos
_idynameen los resultados.Agrega un campo llamado
scorea los resultados.
1 db.customers.aggregate([ 2 { 3 "$search": { 4 "compound": { 5 "must": [{ 6 "in": { 7 "path": "name", 8 "value": ["james sanchez", "jennifer lawrence"] 9 } 10 }], 11 "should": [{ 12 "in": { 13 "path": "_id", 14 "value": [ObjectId("5ca4bbcea2dd94ee58162a72"), ObjectId("5ca4bbcea2dd94ee58162a91")] 15 } 16 }] 17 } 18 } 19 }, 20 { 21 "$limit": 5 22 }, 23 { 24 "$project": { 25 "_id": 1, 26 "name": 1, 27 "score": { $meta: "searchScore" } 28 } 29 } 30 ])
1 [ 2 { 3 _id: ObjectId("5ca4bbcea2dd94ee58162a72"), 4 name: 'James Sanchez', 5 score: 2 6 }, 7 { 8 _id: ObjectId("5ca4bbcea2dd94ee58162a71"), 9 name: 'Jennifer Lawrence', 10 score: 1 11 } 12 ]
MongoDB Search devuelve documentos que contienen James Sanchez y Jennifer Lawrence en el campo name. MongoDB Search asigna una puntuación más alta al documento que contiene name: 'James Sanchez' porque coincide con el ObjectId especificado en la cláusula should.
faceta query
La siguiente consulta utiliza el operador in para buscar clientes activos en el campo active, que contiene un valor booleano. La consulta devuelve el número de clientes activos cuya fecha de nacimiento se encuentra en los siguientes grupos:
1970-01-01, inclusive el límite inferior para este segmento
1980-01-01, límite superior exclusivo para el segmento 1970-01-01 y límite inferior inclusivo para este segmento
1990-01-01, límite superior exclusivo para el segmento 1980-01-01 y límite inferior inclusivo para este segmento
2000-01-01, límite superior exclusivo para el intervalo 1990-01-01
1 db.customers.aggregate([ 2 { 3 "$searchMeta": { 4 "facet": { 5 "operator": { 6 "in": { 7 "path": "active", 8 "value": null 9 } 10 }, 11 "facets": { 12 "birthdateFacet": { 13 "type": "date", 14 "path": "birthdate", 15 "boundaries": [ISODate("1970-01-01"), ISODate("1980-01-01"), ISODate("1990-01-01"), ISODate("2000-01-01")], 16 "default": "other" 17 } 18 } 19 } 20 } 21 } 22 ])
[ { count: { lowerBound: Long('1') }, facet: { birthdateFacet: { buckets: [ { _id: ISODate('1970-01-01T00:00:00.000Z'), count: Long('1') }, { _id: ISODate('1980-01-01T00:00:00.000Z'), count: Long('0') }, { _id: ISODate('1990-01-01T00:00:00.000Z'), count: Long('0') } ] } } } ]