Definición
$metaDevuelve los metadatos asociados con un documento, por ejemplo,
"textScore"al realizar una búsqueda de texto.Una expresión
$metatiene la siguiente sintaxis:{ $meta: <metaDataKeyword> } La expresión
$metapuede especificar los siguientes valores como el<metaDataKeyword>:KeywordDescripción"textScore"Devuelve la puntuación asociada con el correspondiente
$textquery para cada documento que coincida. La puntuación del texto indica qué tan bien el documento coincide con el término o términos de búsqueda.{ $meta: "textScore" }se debe usar junto con una query$text.En versiones anteriores, si no se usa en conjunto con una
$textquery, retorna una puntuación nula.$textproporciona capacidades de query de texto para implementaciones autogestionadas (no pertenecientes a Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de búsqueda de texto completo, Búsqueda de Atlas."indexKey"Devuelve una clave de índice para el documento si se utiliza un índice que no es detexto. La expresión
{ $meta: "indexKey" }es solo para fines de depuración, y no para la lógica de la aplicación, y se prefiere sobrecursor.returnKey().MongoDB Atlas Search proporciona palabras clave adicionales de
$meta, como:Consulta la documentación de Atlas Search para obtener más detalles.
Comportamiento
Metadatos de puntuación de texto $meta: "textScore"
Requiere búsqueda $text
La expresión
{ $meta: "textScore" }debe usarse junto con$text. Por ejemplo:En la agregación, debe especificar una etapa
$matchcon una consulta$texten la pipeline para utilizar la expresión{ $meta: "textScore" }en la(s) etapa(s) posterior(es). Si no especifica la consulta$texten la etapa$match, la operación fallará.En find, debes especificar el operador
$texten el predicado de query para usar{ $meta: "textScore" }. Si no especifica el operador$texten el predicado de query, la operación falla.
Nota
$textproporciona capacidades de query de texto para implementaciones autogestionadas (no pertenecientes a Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de búsqueda de texto completo, Búsqueda de Atlas.
Disponibilidad
En agregación, la expresión
{ $meta: "textScore" }puede incluirse en varias etapas que aceptan expresiones de agregación, como$project,$group$sort, etc.En "find", la expresión
{ $meta: "textScore" }puede ser incluida en la proyección y ensort().
Uso en proyección
La expresión
{ $meta: "textScore" }puede formar parte del documento de proyección para incluir los metadatos de la puntuación de texto.La expresión
$metapuede estar presente tanto en una proyección de inclusión como en una de exclusión.Si configuró la expresión con un nombre de campo que ya existe en el documento, el valor de los metadatos proyectados sobrescribe el valor existente.
Filtro en Puntuación de texto
En la agregación, luego de una etapa que produce un campo con el valor de puntuación de texto, puedes especificar una condición de query u operar en el campo en las etapas posteriores. Por ejemplo, consulte $text en la canalización de agregación en implementaciones autogestionadas.
En find, no puedes especificar una condición de query sobre la puntuación de texto. Use la agregación en su lugar.
Uso en ordenamiento
La expresión
{ $meta: "textScore" }puede usarse como parte de una operación de ordenación para ordenar por los metadatos de puntaje de texto; es decir,Los metadatos
"textScore"se colocan en orden descendente.Para usar en una operación de ordenación, establezca la expresión
{ $meta: "textScore" }en un nombre de campo arbitrario. El sistema de query ignora el nombre del campo.
Ordenar sin proyección
En la agregación, puedes ordenar los documentos resultantes por
{ $meta: "textScore" }sin tener que proyectar también eltextScore.En la búsqueda, puede ordenar los documentos resultantes por
{ $meta: "textScore" }sin tener que proyectar también eltextScore.
Ordenar con proyección
En la agregación, si se incluye la expresión
{ $meta: "textScore" }tanto en la proyección como en la clasificación, la proyección y la clasificación pueden tener diferentes nombres de campo para la expresión. El nombre del campo de ordenación es ignorado por el sistema de query.En encontrar, si se incluye la expresión
{ $meta: "textScore" }tanto en la proyección como en la ordenación, la proyección y la ordenación pueden utilizar diferentes nombres de campo para la expresión. El sistema de query no tiene en cuenta el nombre del campo en el ordenamiento.
Metadatos de clave de índice $meta: "indexKey" (Agregación y Búsqueda)
Uso
La expresión
{ $meta: "indexKey" }es solo para fines de depuración y no para lógica de aplicaciones.Se prefiere la expresión
{ $meta: "indexKey" }sobrecursor.returnKey().
Disponibilidad
En la agregación, la expresión
{ $meta: "indexKey" }se puede incluir en varias etapas que aceptan expresiones de agregación, como$project,$group$sortByCount, etc., pero no$sort. Sin embargo, con un pipeline de agregación, primero puedes proyectar la expresión{ $meta: "indexKey" }(como en un$project,$addFields, etc.), y luego, ordenar por ese campo en una etapa$sortposterior.En find, la expresión
{ $meta: "indexKey" }solo está disponible como parte del documento de proyección.
Valor de retorno
El valor devuelto depende de cómo la base de datos decide representar los valores en un índice y puede cambiar entre versiones. El valor representado puede no ser el valor real del campo.
El valor devuelto depende del plan de ejecución elegido por el sistema. Por ejemplo, si hay dos índices posibles que pueden utilizarse para responder a la query, entonces el valor de los metadatos "claveIndice" depende de qué índice se seleccione.
Si un índice es no se utiliza, la expresión
{ $meta: "indexKey" }no devuelve un valor y el campo no se incluye como parte de la salida.
Ejemplos
$meta: "textScore"
Crea una colección de articles con los siguientes documentos:
db.articles.insertMany([ { "_id" : 1, "title" : "cakes and ale" }, { "_id" : 2, "title" : "more cakes" }, { "_id" : 3, "title" : "bread" }, { "_id" : 4, "title" : "some cakes" }, { "_id" : 5, "title" : "two cakes to go" }, { "_id" : 6, "title" : "pie" } ])
Crea un índice de texto en el campo title:
db.articles.createIndex( { title: "text"} )
La siguiente operación de agregación realiza una búsqueda textual y utiliza el operador $meta para agrupar por la puntuación de búsqueda de texto:
db.articles.aggregate( [ { $match: { $text: { $search: "cake" } } }, { $group: { _id: { $meta: "textScore" }, count: { $sum: 1 } } } ] )
La operación devuelve los siguientes resultados:
{ "_id" : 0.75, "count" : 1 } { "_id" : 0.6666666666666666, "count" : 1 } { "_id" : 1, "count" : 2 }
Para más ejemplos, consulta $text en la pipeline de agregación en Despliegues autogestionado.
La siguiente query realiza una búsqueda de texto del término cake y utiliza el operador $meta en el documento de proyección para incluir el puntaje asignado a cada documento coincidente:
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
La operación devuelve los siguientes documentos con la puntuación de texto:
{ "_id" : 4, "title" : "some cakes", "score" : 1 } { "_id" : 1, "title" : "cakes and ale", "score" : 0.75 } { "_id" : 5, "title" : "two cakes to go", "score" : 0.6666666666666666 } { "_id" : 2, "title" : "more cakes", "score" : 1 }
Para obtener ejemplos adicionales de "textScore" proyecciones y ordenamientos, consulta Ejemplos de puntuación de relevancia.
$meta: "indexKey"
Nota
La expresión { $meta: "indexKey" } es únicamente para fines de depuración y no para la lógica de la aplicación. MongoDB devuelve el valor asociado con el índice elegido por el sistema de query. El sistema puede elegir un índice diferente en posteriores ejecuciones.
Para el índice seleccionado, el valor devuelto depende de cómo decida la base de datos representar los valores en un índice y puede cambiar entre versiones. El valor representado puede no ser el valor real del campo.
Crea una colección de orders con los siguientes documentos:
db.orders.insertMany([ { "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type": "apparel" }, { "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type": "electronics" }, { "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type": "apparel" } ])
Crea el siguiente índice compuesto en los campos type y item:
db.orders.createIndex( { type: 1, item: 1 } )
La siguiente operación de agregación encuentra todos los documentos con type igual a apparel y usa el $meta operador para incluir el valor de la clave del índice en el documento coincidente si se utilizó un índice:
db.orders.aggregate( [ { $match: { type: "apparel" } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
La siguiente operación busca todos los documentos con type igual a apparel y utiliza el operador $meta para incluir el valor clave de índice para el documento coincidente si se utilizó un índice:
db.orders.find( { type: "apparel" }, { idxKey: { $meta: "indexKey" } } )
La operación devuelve los documentos coincidentes con su clave de índice correspondiente:
{ "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"), "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } }
Si no se usa ningún índice, { $meta: "indexKey" } no devuelve nada.
Por ejemplo, la siguiente operación no utiliza un índice ya que no existe un índice en el campo price para apoyar la condición de coincidencia:
db.orders.aggregate( [ { $match: { price: { $gte: NumberDecimal("10") } } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
Por ejemplo, la siguiente operación no utiliza un índice ya que no existe un índice en el campo price para apoyar la condición de coincidencia:
db.orders.find( { price: { $gte: NumberDecimal("10") } }, { idxKey: { $meta: "indexKey" } } )
La operación devuelve los documentos coincidentes sin el campo idxKey:
{ "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcde"), "item" : "abc", "price" : NumberDecimal("12"), "quantity" : 2, "type" : "apparel" } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dcdf"), "item" : "jkl", "price" : NumberDecimal("20"), "quantity" : 1, "type" : "electronics" } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : NumberDecimal("10"), "quantity" : 5, "type" : "apparel" }