DefiniciĂłn
embeddedDocumentEl operador
embeddedDocumentes similar al operador$elemMatch. Restringe que varios predicados de query se cumplan a partir de un Ășnico elemento de un arreglo de documentos incrustados.embeddedDocumentsolo se puede usar para query sobre campos del tipo embeddedDocuments.
Sintaxis
embeddedDocument tiene la siguiente sintaxis:
{ "embeddedDocument": { "path": "<path-to-field>", "operator": { <operator-specification> }, "score": { <score-options> } } }
opciones
embeddedDocument utiliza las siguientes opciones para construir una query:
Campo | Tipo | DescripciĂłn | Necesidad |
|---|---|---|---|
| Objeto | Operador que se utilizarĂĄ para consultar cada documento en el arreglo de documentos que se especifique en el | Requerido |
| string | Campo indexado de tipo embeddedDocuments para bĂșsqueda. El campo especificado debe ser el campo padre de todos los operadores y campos especificados usando la opciĂłn | Requerido |
| Objeto | PuntuaciĂłn que asignar a los resultados de bĂșsqueda coincidentes. Puede utilizar la | Opcional |
embeddedDocument Limitaciones de operador
No puedes usar resaltar en consultas dentro del operador embeddedDocument.
Nota
MongoDB Search deja de replicar cambios para Ăndices mayores a 2,100,000,000 objetos de Ăndice por particiĂłn, en un set de rĂ©plicas o en una sola particiĂłn, donde cada documento principal incrustado indexado cuenta como un Ășnico objeto. Si se supera este lĂmite, pueden generarse resultados de query obsoletos.
Usar el tipo de campo embeddedDocuments puede hacer que la indexaciĂłn de objetos supere este lĂmite de tamaño de Ăndice, porque cada documento incrustado indexado se cuenta como un solo objeto. Si se crea un Ăndice de MongoDB Search que tiene o tendrĂĄ pronto mĂĄs de 2.1 mil millones de objetos de Ăndice, se debe usar la opciĂłn de Ăndice numPartitions para particionar el Ăndice (compatible solo con implementaciones de nodos de Search) o crear una particiĂłn del clĂșster.
Comportamiento
Cuando usted consulta documentos incrustados en arreglos utilizando el operador embeddedDocument, MongoDB Search evalĂșa y califica las condiciones de query del operador en diferentes etapas de la ejecuciĂłn de la query. MongoDB Search:
EvalĂșa cada documento incrustado en el arreglo de forma independiente.
Une los resultados coincidentes con el documento principal si se especifican otros predicados de query a través del compuesto.
Comportamiento de la puntuaciĂłn
De forma predeterminada, el operador embeddedDocument utiliza la estrategia de agregaciĂłn predeterminada, sum, para combinar puntuaciones de coincidencias de documentos incrustados. La opciĂłn embeddedDocument operador score le permite anular lo por defecto y configurar la puntuaciĂłn de los resultados coincidentes mediante la opciĂłn embedded.
Comportamiento de ordenaciĂłn
Para ordenar los documentos parent por un campo de documento incrustado, debes realizar lo siguiente:
Indexa los padres del campo de documento incrustado como el tipo documento.
Indexa el campo secundario con valores de string dentro del documento incrustado como el tipo de token. Para los campos secundarios con valores numéricos y de fecha, habilita la asignación dinåmica para indexar esos campos automåticamente.
MongoDB Search ordena solo en documentos principales. No ordena los campos hijo dentro de un arreglo de documentos. Para un ejemplo, consulte Ejemplo de clasificaciĂłn.
Comportamiento de faceta
Para crear una faceta solo en los documentos secundarios de un arreglo embeddedDocuments que coincidan con su query, agregue un bloque embeddedDocument coincidente a la definiciĂłn de la faceta, ademĂĄs de usar embeddedDocument en el operator de la query. Si omite el bloque embeddedDocument en la definiciĂłn de la faceta, MongoDB Search aplica faceta a todos los documentos secundarios del arreglo, no solo a los que coinciden con su query. Para obtener mĂĄs informaciĂłn, consulte Faceta en la bĂșsqueda de elementos secundarios coincidentes de un arreglo de documentos incrustados.
Resaltado
Puedes resaltar en campos si los campos estĂĄn indexados bajo un campo principal de tipo documento para predicados de query especificados dentro del operador embeddedDocument. Para ver un ejemplo, consulte el tutorial.
Para aprender sobre las limitaciones del operador embeddedDocument, consulta embeddedDocument Limitaciones del operador.
Ejemplos
Los siguientes ejemplos utilizan la colecciĂłn sample_supplies.sales del conjunto de datos de muestra.
DefiniciĂłn del Ăndice
Estas consultas de ejemplo utilizan la siguiente definiciĂłn de Ăndice en la colecciĂłn:
{ "mappings": { "dynamic": true, "fields": { "items": [ { "dynamic": true, "type": "embeddedDocuments" }, { "dynamic": true, "fields": { "tags": { "type": "token" } }, "type": "document" } ], "purchaseMethod": { "type": "token" } } } }
query bĂĄsica
La siguiente query busca elementos en la colecciĂłn etiqueta school con preferencia por los elementos llamados backpack. MongoDB Search puntĂșa los resultados en orden descendente segĂșn la puntuaciĂłn promedio (media aritmĂ©tica) de todos los documentos incrustados coincidentes. La query incluye una fase $limit para limitar la salida a 5 documentos y una fase $project para:
Excluye todos los campos excepto los campos
items.nameyitems.tagsAñade un campo llamado
score
1 db.sales.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "items", 5 "operator": { 6 "compound": { 7 "must": [{ 8 "text": { 9 "path": "items.tags", 10 "query": "school" 11 } 12 }], 13 "should": [{ 14 "text": { 15 "path": "items.name", 16 "query": "backpack" 17 } 18 }] 19 } 20 }, 21 "score": { 22 "embedded": { 23 "aggregate": "mean" 24 } 25 } 26 } 27 } 28 }, 29 { 30 $limit: 5 31 }, 32 { 33 $project: { 34 "_id": 0, 35 "items.name": 1, 36 "items.tags": 1, 37 "score": { $meta: "searchScore" } 38 } 39 })
faceta query
La siguiente query busca elementos etiquetados con school dando preferencia a los elementos llamados backpack. Solicita informaciĂłn de facetas en el campo purchaseMethod.
1 db.sales.aggregate({ 2 "$searchMeta": { 3 "facet": { 4 "operator": { 5 "embeddedDocument": { 6 "path": "items", 7 "operator": { 8 "compound": { 9 "must": [ 10 { 11 "text": { 12 "path": "items.tags", 13 "query": "school" 14 } 15 } 16 ], 17 "should": [ 18 { 19 "text": { 20 "path": "items.name", 21 "query": "backpack" 22 } 23 } 24 ] 25 } 26 } 27 } 28 }, 29 "facets": { 30 "purchaseMethodFacet": { 31 "type": "string", 32 "path": "purchaseMethod" 33 } 34 } 35 } 36 } 37 })
Query y ordena
La siguiente query busca elementos con el nombre laptop y ordena los resultados por el campo items.tags. La query incluye una fase $limit para limitar la salida a 5 documentos y una fase $project para:
Excluir todos los campos salvo
items.nameyitems.tagsAñade un campo llamado
score
1 db.sales.aggregate({ 2 "$search": { 3 "embeddedDocument": { 4 "path": "items", 5 "operator": { 6 "text": { 7 "path": "items.name", 8 "query": "laptop" 9 } 10 } 11 }, 12 "sort": { 13 "items.tags": 1 14 } 15 } 16 }, 17 { 18 "$limit": 5 19 }, 20 { 21 "$project": { 22 "_id": 0, 23 "items.name": 1, 24 "items.tags": 1, 25 "score": { "$meta": "searchScore" } 26 } 27 })
query solo para documentos incrustados coincidentes
La siguiente query devuelve solo los documentos anidados que coinciden con la query. La query utiliza clĂĄusulas de operador compuesto de MongoDB Search en la etapa $search para encontrar documentos coincidentes y luego los operadores de agregaciĂłn en la etapa $project para devolver solo los documentos incrustados coincidentes. En concreto, la query especifica las siguientes etapas del pipeline:
Especifica los siguientes criterios en la clĂĄusula
| |
Limita la salida a | |
Realiza las siguientes acciones:
|
1 db.sales.aggregate( 2 { 3 "$search": { 4 "embeddedDocument": { 5 "path": "items", 6 "operator": { 7 "compound": { 8 "must": [ 9 { 10 "range": { 11 "path": "items.quantity", 12 "gt": 2 13 } 14 }, 15 { 16 "exists": { 17 "path": "items.price" 18 } 19 }, 20 { 21 "text": { 22 "path": "items.tags", 23 "query": "school" 24 } 25 } 26 ] 27 } 28 } 29 } 30 } 31 }, 32 { 33 "$limit": 2 34 }, 35 { 36 "$project": { 37 "_id": 0, 38 "storeLocation": 1, 39 "items": { 40 "$filter": { 41 "input": "$items", 42 "cond": { 43 "$and": [ 44 { 45 "$ifNull": [ 46 "$$this.price", "false" 47 ] 48 }, 49 { 50 "$gt": [ 51 "$$this.quantity", 2 52 ] 53 }, 54 { 55 "$in": [ 56 "office", "$$this.tags" 57 ] 58 } 59 ] 60 } 61 } 62 } 63 } 64 } 65 )
Obtén mås información
Para obtener mĂĄs informaciĂłn, consulta CĂłmo ejecutar queries de bĂșsqueda de MongoDB en campos de documentos incrustados.