Definición
$metaDevuelve los metadatos asociados con un documento, por ejemplo,
"textScore"al realizar una búsqueda de texto.A
$metaLa expresión tiene la siguiente sintaxis:{ $meta: <metaDataKeyword> } La expresión puede especificar los siguientes
$metavalores<metaDataKeyword>como:KeywordDescripción"textScore"Devuelve la puntuación asociada con el correspondiente
$textConsulta por cada documento coincidente. La puntuación del texto indica la precisión con la que el documento coincidió con el término o términos de búsqueda.{ $meta: "textScore" }debe utilizarse junto con una consulta$text.En versiones anteriores, si no se utiliza junto con una consulta
$text, devuelve una puntuación nula.$textProporciona funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de consulta de texto completo: Atlas Search."indexKey"Devuelve una clave de índice para el documento si se utiliza un índice no textual. La
{ $meta: "indexKey" }expresión es solo para fines de depuración, no para la lógica de la aplicación, y se prefierecursor.returnKey()a.MongoDB Atlas Search proporciona
$metapalabras clave adicionales, como:"searchSequenceToken" (disponiblea partir de MongoDB 7.0.5 6.0.13y)
Consulte la documentación de Atlas Search para obtener más detalles.
Importante
Las siguientes
$metapalabras clave no son compatibles con la API estable1 V:"textScore""indexKey""searchScore""searchHighlights"(Disponiblea partir de MongoDB 7.0.5 6.0.13y)"searchSequenceToken""searchScoreDetails"
Comportamiento
Metadatos de puntuación de texto $meta: "textScore"
Requiere búsqueda de $texto
La
{ $meta: "textScore" }expresión debe usarse junto con. Por$textejemplo: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 la función find, debe especificar el operador
$texten el predicado de la consulta para usar{ $meta: "textScore" }. Si no especifica el operador$texten el predicado de la consulta, la operación fallará.
Nota
$textProporciona funciones de consulta de texto para implementaciones autogestionadas (no Atlas). Para los datos alojados en MongoDB Atlas, MongoDB ofrece una solución mejorada de consulta de texto completo: Atlas Search.
Disponibilidad
En la agregación, la
{ $meta: "textScore" }expresión se puede incluir en varias etapas que aceptan expresiones de agregación, como,,$project$group$sortetc.En find, la
{ $meta: "textScore" }expresión se puede incluir en la proyección ysort()en.
Uso en proyección
La
{ $meta: "textScore" }expresión puede ser parte del documento de proyección para incluir los metadatos de la puntuación de texto.La expresión puede estar presente en una proyección de inclusión o de
$metaexclusión.Si establece la expresión en un nombre de campo que ya existe en el documento, el valor de metadatos proyectado sobrescribe el valor existente.
Filtro en Puntuación de texto
En la agregación, tras una etapa que genera un campo con el valor de puntuación de texto, se puede especificar una condición de consulta o realizar operaciones en el campo en etapas posteriores. Por ejemplo, consulte $text en la canalización de agregación de las implementaciones autogestionadas.
En la función de búsqueda, no se puede especificar una condición de consulta en la puntuación de texto. En su lugar, se utiliza la agregación.
Uso en Sort
La expresión
{ $meta: "textScore" }se puede utilizar como parte de una operación de ordenamiento para ordenar por los metadatos de puntuación de texto; es decir,Los metadatos
"textScore"se colocan en orden descendente.Para usarla en una operación de ordenación, asigne a la expresión
{ $meta: "textScore" }un nombre de campo arbitrario. El sistema de consultas ignora este nombre de campo.
Ordenar sin proyección
En agregación, puede ordenar los documentos resultantes por
{ $meta: "textScore" }sin tener que proyectar tambiéntextScore.En la búsqueda, puedes ordenar los documentos resultantes por
{ $meta: "textScore" }sin tener que proyectar tambiéntextScore.
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 la función find, si se incluye la
{ $meta: "textScore" }expresión tanto en la proyección como en la ordenación, ambas pueden tener nombres de campo diferentes para la expresión. El sistema de consultas ignora el nombre de campo en la ordenación.
Metadatos de la 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.La
{ $meta: "indexKey" }expresión es preferiblecursor.returnKey()a.
Disponibilidad
En la agregación, la
{ $meta: "indexKey" }expresión puede incluirse en varias etapas que aceptan expresiones de$projectagregación, como,,,$group$sortByCountetc., pero no. Sin embargo, con una canalización de agregación, primero se puede proyectar$sortla{ $meta: "indexKey" }expresión (por ejemplo, en,, etc.) y luego$projectordenar por ese campo en$addFields$sortuna etapa posterior.En la búsqueda, la
{ $meta: "indexKey" }expresión 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 variar entre versiones. El valor representado puede no ser el valor real del campo.
El valor devuelto depende del plan de ejecución seleccionado por el sistema. Por ejemplo, si hay dos índices posibles para responder a la consulta, el valor del metadato "indexKey" depende del índice seleccionado.
Si un índice es no se utiliza, la
{ $meta: "indexKey" }expresión no devuelve un valor y el campo no se incluye como parte de la salida.
Ejemplos
$meta: "textScore"
Crea una colección 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 de texto y utiliza el operador para agrupar por la puntuación de búsqueda de $meta 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 obtener más ejemplos, consulte $text en la canalización de agregación en implementaciones autoadministradas.
La siguiente consulta realiza una búsqueda de texto para el término cake y utiliza el operador en el documento de proyección para incluir la puntuación asignada a cada documento $meta coincidente:
db.articles.find( { $text: { $search: "cake" } }, { score: { $meta: "textScore" } } )
La operación devuelve los siguientes documentos con el texto puntuación:
{ "_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 ordenaciones, consulte Ejemplos de puntuación de relevancia.
$meta: "indexKey"
Nota
La expresión { $meta: "indexKey" } se utiliza únicamente para fines de depuración y no para la lógica de la aplicación. MongoDB devuelve el valor asociado al índice seleccionado por el sistema de consultas. El sistema puede seleccionar un índice diferente en posteriores ejecuciones.
Para el índice seleccionado, el valor devuelto depende de cómo la base de datos decide representar los valores en un índice y puede variar entre versiones. El valor representado puede no ser el valor real del campo.
Crea una colección orders con los siguientes documentos:
db.orders.insertMany([ { "item" : "abc", "price" : Decimal128("12"), "quantity" : 2, "type": "apparel" }, { "item" : "jkl", "price" : Decimal128("20"), "quantity" : 1, "type": "electronics" }, { "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type": "apparel" } ])
Cree el siguiente índice compuesto en los campos type y item:
db.orders.createIndex( { type: 1, item: 1 } )
La siguiente operación de agregación busca todos los documentos con type igual a apparel y utiliza el operador para incluir el valor de la clave de índice para el documento coincidente si se utilizó un $meta í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 para incluir el valor de la clave de índice para el documento coincidente si se utilizó un $meta í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" : Decimal128("12"), "quantity" : 2, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } } { "_id" : ObjectId("5e98a33ceaf5e9dcf2b8dce0"), "item" : "abc", "price" : Decimal128("10"), "quantity" : 5, "type" : "apparel", "idxKey" : { "type" : "apparel", "item" : "abc" } }
Si no se utiliza ningún índice,{ $meta: "indexKey" } no devuelve nada.
Por ejemplo, la siguiente operación no utiliza un índice ya que no existe ningún índice en el campo price para soportar la condición de coincidencia:
db.orders.aggregate( [ { $match: { price: { $gte: Decimal128("10") } } }, { $addFields: { idxKey: { $meta: "indexKey" } } } ] )
Por ejemplo, la siguiente operación no utiliza un índice ya que no existe ningún índice en el campo price para soportar la condición de coincidencia:
db.orders.find( { price: { $gte: Decimal128("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" }
Los ejemplos de C# en esta página utilizan la base de datos sample_mflix de los conjuntos de datos de muestra de Atlas. Para aprender a crear un clúster gratuito de MongoDB Atlas y cargar los conjuntos de datos de muestra, consulta Primeros pasos en la documentación del controlador de MongoDB .NET/C#.
La siguiente clase Movie modela los documentos en la colección sample_mflix.movies:
public class Movie { public ObjectId Id { get; set; } public string Plot { get; set; } public List<string> Genres { get; set; } public int Runtime { get; set; } public List<string> Cast { get; set; } public string Title { get; set; } [] public DateTime LastUpdated { get; set; } public string Rated { get; set; } public int Year { get; set; } public ImdbData Imdb { get; set; } public string Type { get; set; } public int Index { get; set; } public string[] Comments { get; set; } public List<BsonDocument> Highlights { get; set; } public float Score { get; set; } [] public SearchScoreDetails ScoreDetails { get; set; } [] public SearchScoreDetails SearchScoreDetails { get; set; } [] public string PaginationToken { get; set; } [] public float[] PlotEmbedding { get; set; } }
Nota
ConventionPack para Pascal Case
Las clases de C# en esta página utilizan Pascal case para los nombres de sus propiedades, pero los nombres de los campos en la colección de MongoDB utilizan camel case. Para tener en cuenta esta diferencia, se puede usar el siguiente código para registrar un ConventionPack cuando la aplicación se inicie:
var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true);
Para incluir la puntuación de búsqueda de texto mediante el controlador .NET/C#, llame a MetaTextScore() método en el constructor de proyecciones.
Primero, ejecute el siguiente código para crear un índice de texto en el campo Title:
var indexModel = new CreateIndexModel<Movie>( Builders<Movie>.IndexKeys.Text(m => m.Title)); movieCollection.Indexes.CreateOne(indexModel);
A continuación, agregue el siguiente código a su aplicación. El código realiza una búsqueda de texto del término "future" y utiliza el método MetaTextScore() para incluir la puntuación asignada a cada documento coincidente. A continuación, ordena los resultados en orden descendente según su puntuación de texto y devuelve el documento con la puntuación más alta.
var filter = Builders<Movie>.Filter.Text("future"); var projection = Builders<Movie>.Projection .Include(m => m.Title) .Include(m => m.Plot) .MetaTextScore(m => m.Score); var result = movieCollection.Find(filter) .Sort(Builders<Movie>.Sort.MetaTextScore("score")) .Project(projection) .FirstOrDefault();
La operación anterior devuelve el siguiente documento:
{ "_id": { "$oid": "573a1398f29313caabceb500" }, "plot": "After visiting 2015, Marty McFly must repeat his visit to 1955 to prevent disastrous changes to 1985... without interfering with his first trip.", "title": "Back to the Future Part II", "score": 1.59375 }