$meta
Nesta página
Definição
$meta
Retorna os metadados associados a um documento, por exemplo,
"textScore"
ao executar pesquisa de texto.Uma expressão
$meta
tem a seguinte sintaxe:{ $meta: <metaDataKeyword> } A expressão
$meta
pode especificar os seguintes valores como<metaDataKeyword>
:Palavra-chaveDescrição"textScore"
Retorna a pontuação associada à query
$text
correspondente a cada documento correspondente. A pontuação de texto indica quão bem o documento correspondeu ao termo ou termos de pesquisa.{ $meta: "textScore" }
deve ser usado em conjunto com uma query$text
.Em versões anteriores, se não usado em conjunto com uma query
$text
, retornará uma pontuação nula."indexKey"
Retorna uma chave de índice para o documento se um índice não texto for usado. A expressão{ $meta: "indexKey" }
é somente para fins de depuração e não para lógica de aplicativo, e é preferida em comparação comcursor.returnKey()
.O MongoDB Atlas Search fornece palavras-chave
$meta
adicionais, como:"searchSequenceToken" (Disponível a partir do MongoDB 7.0.5 e 6.0.13)
Consulte a documentação do Atlas Search para obter detalhes.
Importante
As seguintes palavras-chave
$meta
não são aceitas na API Estável V1:"textScore"
"indexKey"
"searchScore"
"searchHighlights"
(Disponível a partir do MongoDB 7.0.5 e 6.0.13)
Comportamento
Metadados de pontuação de texto $meta: "textScore"
Requer pesquisa $text
A expressão
{ $meta: "textScore" }
deve ser usada em conjunto com a pesquisa$text
. Por exemplo:Na aggregation, você deve especificar um estágio
$match
com uma query$text
no pipeline para usar a expressão{ $meta: "textScore" }
nos estágios posteriores. Se você não especificar a query$text
na etapa$match
, a operação falhará.No achado, você deve especificar o operador
$text
no predicado de query para usar{ $meta: "textScore" }
. Se você não especificar o operador$text
no predicado de query, a operação falhará.
Disponibilidade
Uso na projeção
A expressão
{ $meta: "textScore" }
pode fazer parte do documento de projeção para incluir os metadados de pontuação de texto.A expressão
$meta
pode estar presente em uma inclusão ou uma projeção de exclusão.Se você definir a expressão para um nome de campo que já existe no documento, o valor de metadados projetado substituirá o valor existente.
Filtre na pontuação de texto
Na aggregation, após um estágio que gera um campo com o valor da pontuação de texto, você poderá especificar uma condição de query ou operar no campo em estágios subsequentes. Por exemplo, consulte Pesquisa de texto no aggregation pipeline.
No achado, você não pode especificar uma condição de query na pontuação de texto. Em vez disso, use aggregation.
Uso na classificação
A expressão
{ $meta: "textScore" }
pode ser usada como parte de uma operação de classificação para classificar por metadados da pontuação de texto; ou seja,Os metadados
"textScore"
são classificados em ordem decrescente.Para usar em uma operação de classificação, defina a expressão
{ $meta: "textScore" }
como um nome de campo arbitrário. O nome do campo é desconsiderado pelo sistema de query.
Classificar sem projeção
Na aggregation, você pode classificar os documentos resultantes por
{ $meta: "textScore" }
sem também ter que projetar otextScore
.No achado, você pode classificar os documentos resultantes por
{ $meta: "textScore" }
sem também precisar projetar otextScore
.
Classificar com projeção
Na aggregation, se você incluir a expressão
{ $meta: "textScore" }
tanto na projeção quanto na classificação, a projeção e a classificação poderão ter nomes de campo diferentes para a expressão. O nome do campo na classificação é desconsiderado pelo sistema de query.No achado, se você incluir a expressão
{ $meta: "textScore" }
tanto na projeção quanto na classificação, a projeção e a classificação poderão ter nomes de campo diferentes para a expressão. O nome do campo na classificação é desconsiderado pelo sistema de query.
Metadados da chave do índice $meta: "indexKey" (aggregation e localizar)
Uso
A expressão
{ $meta: "indexKey" }
serve apenas para fins de depuração e não para lógica de aplicativo.A expressão
{ $meta: "indexKey" }
é preferível acursor.returnKey()
.
Disponibilidade
No aggregation, a expressão
{ $meta: "indexKey" }
pode ser incluída em vários estágios que aceitam expressões de aggregation, como$project
,$group
$sortByCount
etc., mas não$sort
. No entanto, com um aggregation pipeline, você pode primeiro projetar a expressão{ $meta: "indexKey" }
(como em um$project
,$addFields
etc.) e, em seguida, classificar por esse campo em um estágio$sort
subsequente.No achado, a expressão
{ $meta: "indexKey" }
só está disponível como parte do documento de projeção .
Valor de retorno
O valor retornado depende de como o banco de dados decide representar valores em um índice e pode mudar entre versões. O valor representado pode não ser o valor real do campo.
O valor retornado depende do plano de execução escolhido pelo sistema. Por exemplo, se houver dois índices possíveis que podem ser usados para responder à query, o valor dos metadados "indexKey" dependerá de qual índice for selecionado.
Se um índice não for usado, a expressão
{ $meta: "indexKey" }
não retornará um valor, e o campo não será incluído como parte da saída.
Exemplos
$meta: "textScore"
Cria uma collection articles
com os seguintes 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" } ])
Crie um índice de texto no campo title
:
db.articles.createIndex( { title: "text"} )
$meta: "indexKey"
Observação
A expressão { $meta: "indexKey" }
serve apenas para fins de depuração e não para lógica de aplicativo. O MongoDB retorna o valor associado ao índice escolhido pelo sistema de query. Ele pode escolher um índice diferente após a execução subsequente.
Para o índice selecionado, o valor retornado depende de como o banco de dados decide representar valores em um índice e pode mudar entre versões. O valor representado pode não ser o valor real do campo.
Cria uma collection orders
com os seguintes 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" } ])
Crie o seguinte índice composto nos campos type
e item
:
db.orders.createIndex( { type: 1, item: 1 } )
A operação retorna os documentos correspondentes com sua chave de índice correspondente:
{ "_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" } }
Se o índice não for usado, { $meta: "indexKey" }
não retornará nada.
A operação retorna os documentos correspondentes sem o 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" }