Visão geral
A Pesquisa do MongoDB permite classificar os resultados em ordem crescente ou decrescente nos campos definidos no índice do MongoDB Search. Você pode classificar pelos seguintes tipos de campo usando a opção sort
:
boolean
date
number
(valores inteiros, float e double)objectId
uuid
string
(indexado como o tipo token)
Você também pode classificar pela pontuação dos documentos nos resultados e por valores nulos.
sort
Compatibilidade de opções
O Atlas oferece suporte a queries de classificação não fragmentadas e fragmentadas em todas as versões principais e secundárias do MongoDB 7.0 e versões posteriores.
sort
Limitações de opção
Você não pode classificar em campos do tipo embeddedDocuments.
Você não pode utilizar a opção
sort
com o operador obsoleto knnBeta.
Uso
Para classificar os resultados do MongoDB Search, você deve fazer o seguinte:
Crie um índice do MongoDB Search nos campos para classificar os resultados.
Para classificar em campos
boolean
,date
,number
,UUID
, eobjectId
, use mapeamentos dinâmicos ou estáticos. Para classificar campos de string, você deve usar mapeamentos estáticos para indexar o campo como o tipotoken
.Crie e execute sua query com a opção
sort
nos campos que você definiu no índice para classificação. Para saber mais, consulte Sintaxe.
Comportamento
Classificar por campo booleano, de data, numérico, UUID, ObjectId ou string
A opção sort
requer um documento que especifica os campos para classificar por e a respectiva ordem de classificação. A Pesquisa do MongoDB segue a ordem de comparação do MongoDB para os tipos de dados suportados. Trata valores UUID como BinData
. Para saber mais, consulte campos inexistentes.
Você pode especificar a seguinte ordem de classificação para classificar seus resultados:
| Classificar em ordem crescente. Quando você classifica em ordem crescente, o MongoDB Search retorna documentos com valores ausentes antes de documentos com valores. |
| Classificar em ordem decrescente. |
Classificar por pontuação e um campo único
Você também pode classificar por pontuação em ordem crescente ou decrescente. A opção sort
recebe um documento que especifica a expressão $meta , que requer o valor searchScore
.
Exemplo
Suponha que seu aplicativo permita que os usuários pulem para a última página dos resultados da pesquisa. O exemplo a seguir classifica os resultados por pontuação em ordem crescente para que o documento com a pontuação mais baixa seja exibido na parte superior dos resultados:
sort: {score: {$meta: "searchScore", order: 1}}
Você pode usar sort
para também garantir que os resultados tenham uma ordem determinada quando vários documentos nos resultados tiverem pontuações idênticas. Por exemplo, se você classificar os resultados por um campo exclusivo, como um campo de data chamado lastUpdated
, conforme mostrado no exemplo a seguir, o MongoDB Search retornará resultados com pontuações idênticas em uma ordem determinada:
Exemplo
sort: {score: {$meta: "searchScore"}, lastUpdated: 1}
No entanto, se você não especificar um campo exclusivo para classificar os resultados, o MongoDB Search retornará os resultados classificados por pontuação em ordem decrescente. A Pesquisa do MongoDB retorna resultados com pontuações ou valores idênticos em uma ordem arbitrária. O exemplo a seguir não classifica os resultados por um campo exclusivo.
Exemplo
sort: {score: {$meta: "searchScore"}}
Para saber mais, consulte Pontuação dos documentos nos resultados.
arrays de classificação
O MongoDB Search nivela as arrays para classificação.
Exemplo
Considere a seguinte array:
[4, [1, [8,5], 9], 2]
A Pesquisa do MongoDB nivela a array anterior semelhante ao seguinte:
4, 1, 8, 5, 9, 2
Para uma classificação ascendente, o MongoDB Search usa 1
para comparar a array com outros valores. Para uma classificação decrescente, a Pesquisa MongoDB usa 9
para comparar a array com outros valores.
Ao comparar com elementos dentro de uma array:
Para uma classificação ascendente, o MongoDB Search compara os menores elementos da array ou executa uma comparação menor que (
<
).Exemplo
A Pesquisa do MongoDB classifica os resultados na seguinte ordem se você classificar por números em ordem crescente:
-20 [-3, 12] // <- -3 comes before 5. 5 [6, 18] // <- 6 comes after 5. 13 14 Para uma classificação decrescente, o MongoDB Search compara os maiores elementos da array ou executa uma comparação maior que (
>
).Exemplo
A Pesquisa do MongoDB classifica os resultados na seguinte ordem se você classificar por números em ordem decrescente:
[6, 18] // <- 18 comes before 14. 14 13 [-3, 12] // <- 12 comes after 13. 5 -20
Classificar arrays com vários tipos
Ao ordenar campos de array que contêm valores de vários tipos BSON, o MongoDB Search seleciona um elemento representativo da array para usar em comparação, de acordo com a ordem de comparação e classificação do MongoDB por padrão.
Para uma classificação ascendente, o MongoDB Search usa o elemento com o menor tipo de BSON.
Para uma classificação decrescente, o MongoDB Search usa o elemento com o tipo de BSON mais alto.
Se houver vários valores do mesmo tipo de BSON na array, o comportamento de classificação padrão para o tipo selecionado será aplicado.
Exemplo
Considere a seguinte array:
[ 'foo', null, 15, true, false ]
Para uma classificação ascendente, o MongoDB Search usa
null
, pois é o tipo de BSON mais baixo suportado.Para uma classificação decrescente, a Pesquisa do MongoDB
true
usa, pois é o tipo de BSON mais alto na array, e a Pesquisa do MongoDB classificatrue
valores acima defalse
valores.
No entanto, se você definir noData: highest
em sua sintaxe sort
, o MongoDB Search considerará valores nulos e ausentes como o tipo de BSON mais alto. Para a array de exemplo , o seguinte comportamento se aplica:
Para uma classificação ascendente, o MongoDB Search usa
15
, pois agora é o tipo BSON mais baixo na array.Para uma classificação decrescente, o MongoDB Search usa
null
, pois agora é o tipo BSON mais alto na array.
Para saber mais, consulte Classificar por Valores Nulos e Omitidos.
Para ver um exemplo, consulte Classificar arrays com vários tipos.
Classificar por Valores Nulos e Omitidos
A Pesquisa do MongoDB trata os valores nulos como iguais a valores ausentes e vazios, e a ordem dos documentos com esses valores não é determinística na classificação.
Por padrão, o MongoDB Search segue a comparação do MongoDB e a ordem de classificação e considera valores nulos como menores do que todos os outros tipos de BSON suportados. Portanto, os valores nulos aparecem na parte superior dos resultados durante uma classificação ascendente e na parte inferior durante uma classificação descendente.
Para configurar onde os valores nulos aparecem nos resultados, especifique o noData
campo em sua sort
sintaxe. O campo noData
recebe os seguintes valores:
lowest
(padrão): define valores nulos como o tipo de BSON mais baixo durante a classificação. Classifica valores nulos na parte superior dos resultados durante uma classificação ascendente e na parte inferior durante uma classificação descendente.highest
: define valores nulos como o tipo BSON mais alto durante a classificação. Classifica valores nulos na parte inferior dos resultados durante uma classificação ascendente e na parte superior durante uma classificação descendente.
Observação
O mesmo comportamento se aplica ao classificar arrays com vários tipos que contêm valores nulos ou ausentes.
Para obter exemplos, consulte Classificar por valores nulos e Classificar em arrays de vários tipos.
Classificar em campos de array de documentos incorporados
Para classificar os documentos-pai por um campo de documento incorporado, faça o seguinte:
Indexe os pais do campo filho do documento incorporado como o tipo de documento .
Indexe o campo secundário com valores de string dentro do documento incorporado como o tipo de token . Para campos secundários com valores numéricos e de data, habilite o mapeamento dinâmico para indexar esses campos automaticamente.
A Pesquisa do MongoDB classifica apenas em documentos principais. Não classifica os campos filhos em uma array de documentos. Para obter um exemplo, consulte Exemplo de classificação.
Considerações
Consistência
Os índices do MongoDB Search acabam sendo consistentes, e os valores retornados nos resultados podem ser diferentes dos valores usados na classificação.
Desempenho
Esta funcionalidade otimiza as queries que utilizam $search
com $limit
como um estágio subsequente. Se o MongoDB Search precisar classificar todos os documentos na collection, a resposta poderá demorar.
Pontuação
O MongoDB Search retorna pontuações para todos os documentos nos resultados. No entanto, você pode ver documentos com pontuação mais alta após documentos com pontuação mais baixa porque a ordem dos documentos nos resultados é baseada nos critérios de classificação, a menos que você classifique explicitamente por pontuação.
Sintaxe
sort
tem a seguinte sintaxe:
1 { 2 "$search": { 3 "index": "<index name>", // optional, defaults to "default" 4 "<operator>": { // such as "text", "compound", or "phrase" 5 <operator-specification> 6 }, 7 "sort": { 8 score: {$meta: "searchScore"}, // optional field 9 "<field-to-sort>": <sort-order>, // 1 or -1, or a document 10 ... 11 } 12 } 13 }
Parâmetro | Descrição | |||||
---|---|---|---|---|---|---|
| Opcional. Determina se a classificação por pontuação de pesquisa deve ser feita. Para saber mais, consulte Classificar por pontuação e um campo exclusivo. | |||||
| Obrigatório. O nome do campo pelo qual classificar. | |||||
| Obrigatório. Determina a ordem de classificação. Use Se você quiser especificar o campo noData , use um documento com a seguinte sintaxe:
|
Exemplos
Os exemplos a seguir usam o sample_mflix.movies
, sample_airbnb.listingsAndReview
ou uma coleção personalizada chamada users
.
➤ Use o menu suspenso Selecione a linguagem para definir a linguagem dos exemplos desta seção.
Definição de Índice
As consultas de exemplo nesta página usam o sample_mflix.movies
, o sample_airbnb.listingsAndReview
ou uma coleção personalizada. Se você criar os seguintes índices nessas coleções, poderá executar as consultas de amostra em relação aos campos indexados.
A definição do índice para a coleção movies
especifica o seguinte:
Indexe o campo
awards.wins
como:number
tipo para classificação e consulta, incluindo a execução de consultasfacet
(Operador de pesquisa do MongoDB)
Indexe o campo
released
como:date
tipo para classificação e consulta, incluindo a execução de consultasfacet
(Operador de pesquisa do MongoDB)
Indexe o campo
title
como:token
tipo para classificaçãostring
tipo para query
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "awards": { 6 "dynamic": false, 7 "fields": { 8 "wins": [ 9 { 10 "type": "number" 11 } 12 ] 13 }, 14 "type": "document" 15 }, 16 "released": [ 17 { 18 "type": "date" 19 } 20 ], 21 "title": [{ 22 "type": "token" 23 }, { 24 "type": "string" 25 }] 26 } 27 } 28 }
Para a definição de índice anterior, o MongoDB Search cria um índice chamado default
com mapeamentos estáticos nos campos especificados.
As consultas de exemplo na coleção sample_airbnb.listingsAndReviews
usam o índice a seguir. A definição do índice especifica mapeamentos dinâmicos nos campos da coleção:
{ "mappings": { "dynamic": true } }
A coleção users
contém os seguintes documentos:
db.users.insertMany([ { "_id": 0, "a": UUID("1a324de2-e34b-c87e-f2a1-42ce37ad74ed"), "b": "hello", "c": ObjectId("507f1f77bcf86cd799439011") }, { "_id": 1, "a": UUID("3b241101-e2bb-4255-8caf-4136c566a962"), "b": "hello", "c": true }, { "_id": 2, "a": UUID("dee11d4e-63c6-4d90-983c-5c9f1e79e96c"), "b": "hello", "c": "foo" }, { "_id": 3, "b": "hello", "c": UUID("3be11d4e-62cb-4e95-9a3c-5c9f1e56c732") }, { "_id": 4, "a": UUID("d3c12e1c-c36e-25ed-7c3e-1e7f1e53c752"), "b": "hello", "c": null }, { "_id": 5, "a": UUID("d73f181e-cdda-42b4-b844-4d6e172e9bc8"), "b": "hello", "c": [] } { "_id": 6, "a": UUID("7eeddf21-b313-4a5c-81c2-c68915daa618"), "b": "hello", } ])
A definição do índice para a coleção users
especifica o seguinte:
Indexe dinamicamente todos os campos, exceto os campos denominados
c
.Campo de indexação estaticamente denominado
c
como os seguintes tipos para classificação:token
uuid
objectId
boolean
1 { 2 "mappings": { 3 "dynamic": true, 4 "fields": { 5 "c": [ 6 { "type": "token" }, 7 { "type": "uuid" }, 8 { "type": "objectId" }, 9 { "type": "boolean" }, 10 { "type": "number" } 11 ] 12 } 13 } 14 }
Para a coleção anterior, o MongoDB Search cria um índice chamado default
com os mapeamentos especificados nos campos especificados.
Pesquisa e classificação de data
A seguinte query mostra como executar uma query de operador composto e classificar os resultados por campo de data. Ela usa os seguintes operadores:
operador curinga para procurar títulos de filmes que comecem com
Summer
.operador próximo para pesquisar filmes que foram lançados em e cerca de cinco meses antes ou depois de 18 de abril de 2014.
Observação
Quando você utiliza
pivot
em um campo de data, sua unidade de medida é em milissegundos. O MongoDB Search calcula uma pontuação para cada documento com base na proximidade do campo de data da data especificada. Para saber mais, veja próximo.
A consulta utiliza os seguintes estágios de pipeline:
$search
estágio para pesquisar os campostitle
ereleased
e, em seguida, classificar os resultados pelo camporeleased
em ordem decrescente.Estágio
$limit
para limitar a saída a5
resultados.$project
estágio para:Excluir todos os campos, exceto
title
ereleased
.Adicione um campo denominado
score
.
Execute a consulta.
Copie e cole a seguinte consulta no Query Editor, e depois clique no botão Search no Query Editor.
[ { $search: { "compound": { "filter": [{ "wildcard": { "query": "Summer*", "path": "title" } }], "must": [{ "near": { "pivot": 13149000000, "path": "released", "origin": ISODate("2014-04-18T00:00:00.000+00:00") } }] }, "sort": { "released": -1, "title": 1 } } } ]
SCORE: 0.348105788230896 _id: "573a13f0f29313caabddaf7a" countries: Array runtime: 104 cast: Array ... title: "Summer Nights" ... released: 2015-01-28T00:00:00.000+00:00 ... SCORE: 0.5917375683784485 _id: "573a13e6f29313caabdc673b" plot: "25-year-old Iiris and Karoliina have been best friends since childhood…" genres: Array runtime: 90 ... title: "Summertime" ... released: 2014-08-01T00:00:00.000+00:00 ... SCORE: 0.9934720396995544 _id: "573a13eff29313caabdd760c" plot: "Erik Sparrow is one of the lucky ones. He's got a good job. He's in a …" genres: Array runtime: 86 ... title: "Summer of Blood" ... released: 2014-04-17T00:00:00.000+00:00 ... SCORE: 0.15982933342456818 _id: "573a13cff29313caabd8ab74" plot: "The story of an adult and a teenage couple during a brief summer holid…" genres: Array countries: Array ... title: "Summer Games" ... released: 2012-02-08T00:00:00.000+00:00 ... SCORE: 0.13038821518421173 _id: "573a13cef29313caabd87f4e" plot: "Summer of Goliath is a documentary/fiction hybrid that narrates variou…" genres: Array runtime: 78 ... title: "Summer of Goliath" ... released: 2011-07-08T00:00:00.000+00:00 ... SCORE: 0.08124520629644394 _id: "573a13c7f29313caabd7608d" plot: "A student tries to fix a problem he accidentally caused in OZ, a digit…" genres: Array runtime: 114 ... title: "Summer Wars" ... released: 2009-08-01T00:00:00.000+00:00 SCORE: 0.0711759403347969 _id: "573a13bbf29313caabd54ee6" plot: "The life of a public school epitomized by disobedient student Jonah Ta…" genres: Array runtime: 30 ... title: "Summer Heights High" ... released: 2008-11-09T00:00:00.000+00:00 ... SCORE: 0.06951779872179031 _id: "573a13bff29313caabd5f935" plot: "On his spring break at the seaside, with his wife and his four year ol…" genres: Array runtime: 102 ... title: "Summer Holiday" ... released: 2008-09-19T00:00:00.000+00:00 ... SCORE: 0.05834990739822388 _id: "573a13c0f29313caabd628ac" plot: "Kochi Uehara is a fourth grade student living in the suburb of Tokyo. …" genres: Array runtime: 138 ... title: "Summer Days with Coo" ... released: 2007-07-28T00:00:00.000+00:00 ... SCORE: 0.056174591183662415 _id: "573a13b8f29313caabd4c1d0" fullplot: "Country girl Yu Hong leaves her village, her family and her lover to s…" genres: Array runtime: 158 ... title: "Summer Palace" ... released: 2007-04-18T00:00:00.000+00:00 ...
Para executar a query em mongosh
:
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "default", 5 "compound": { 6 "filter": [{ 7 "wildcard": { 8 "query": "Summer*", 9 "path": "title" 10 } 11 }], 12 "must": [{ 13 "near": { 14 "pivot": 13149000000, 15 "path": "released", 16 "origin": ISODate("2014-04-18T00:00:00.000+00:00") 17 } 18 }] 19 }, 20 "sort": { 21 "released": -1 22 } 23 } 24 }, 25 { 26 $limit: 5 27 }, 28 { 29 $project: { 30 "_id": 0, 31 "title": 1, 32 "released": 1, 33 "score": { 34 "$meta": "searchScore" 35 } 36 } 37 }])
[ { title: 'Summer Nights', released: ISODate("2015-01-28T00:00:00.000Z"), score: 0.348105788230896 }, { title: 'Summertime', released: ISODate("2014-08-01T00:00:00.000Z"), score: 0.5917375683784485 }, { title: 'Summer of Blood', released: ISODate("2014-04-17T00:00:00.000Z"), score: 0.9934720396995544 }, { title: 'Summer Games', released: ISODate("2012-02-08T00:00:00.000Z"), score: 0.15982933342456818 }, { title: 'Summer of Goliath', released: ISODate("2011-07-08T00:00:00.000Z"), score: 0.13038821518421173 } ]
No MongoDB Compass, configure cada um dos seguintes estágios do pipeline selecionando o estágio no menu suspenso e adicionando a query para esse estágio. Clique em Add Stage para adicionar estágios adicionais.
estágio do pipeline | Query | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| |||||||||||||||||||||
|
| |||||||||||||||||||||
|
|
Se você habilitou o Auto Preview, o MongoDB Compass exibe os seguintes documentos ao lado da etapa de pipeline do $limit
:
{ title: 'Summer Nights', released: 2015-01-28T00:00:00.000+00:00, score: 0.348105788230896 }, { title: 'Summertime', released: 2014-08-01T00:00:00.000+00:00, score: 0.5917375683784485 }, { title: 'Summer of Blood', released: 2014-04-17T00:00:00.000+00:00, score: 0.9934720396995544 }, { title: 'Summer Games', released: 2012-02-08T00:00:00.000+00:00, score: 0.15982933342456818 }, { title: 'Summer of Goliath', released: 2011-07-08T00:00:00.000+00:00, score: 0.13038821518421173 }
Defina a query.
Substitua o conteúdo do arquivo
Program.cs
pelo seguinte código.1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class SortByStrings 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 23 // declare data for compound query 24 var originDate = new DateTime(2014, 04, 18, 0, 0, 0, DateTimeKind.Utc); 25 26 // define search options 27 var searchOptions = new SearchOptions<MovieDocument>() 28 { 29 Sort = Builders<MovieDocument>.Sort.Descending(movie => movie.Released), 30 IndexName = "default" 31 }; 32 33 // define and run pipeline 34 var results = moviesCollection.Aggregate() 35 .Search(Builders<MovieDocument>.Search.Compound() 36 .Filter(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Summer*")) 37 .Must(Builders<MovieDocument>.Search.Near(movie => movie.Released, originDate, 13149000000)), searchOptions) 38 .Project<MovieDocument>(Builders<MovieDocument>.Projection 39 .Include(movie => movie.Released) 40 .Include(movie => movie.Title) 41 .Exclude(movie => movie.Id) 42 .MetaSearchScore(movie => movie.Score)) 43 .Limit(5) 44 .ToList(); 45 46 // print results 47 foreach (var movie in results) 48 { 49 Console.WriteLine(movie.ToJson()); 50 } 51 } 52 } 53 54 [ ]55 public class MovieDocument 56 { 57 [ ]58 public ObjectId Id { get; set; } 59 public DateTime Released { get; set; } 60 public string Title { get; set; } 61 public double Score { get; set; } 62 } Especifique o
<connection-string>
.
Execute a consulta.
dotnet run Program.cs
{ "released" : ISODate("2015-01-28T00:00:00Z"), "title" : "Summer Nights", "score" : 0.348105788230896 } { "released" : ISODate("2014-08-01T00:00:00Z"), "title" : "Summertime", "score" : 0.59173756837844849 } { "released" : ISODate("2014-04-17T00:00:00Z"), "title" : "Summer of Blood", "score" : 0.99347203969955444 } { "released" : ISODate("2014-01-17T00:00:00Z"), "title" : "Summer in February", "score" : 0.62580311298370361 } { "released" : ISODate("2012-02-08T00:00:00Z"), "title" : "Summer Games", "score" : 0.15982933342456818 }
Defina a query.
Crie um novo arquivo chamado
sort-by-date.go
e cole o código a seguir:1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/v2/bson" 9 "go.mongodb.org/mongo-driver/v2/mongo" 10 "go.mongodb.org/mongo-driver/v2/mongo/options" 11 ) 12 13 func main() { 14 // connect to your Atlas cluster 15 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string")) 16 if err != nil { 17 panic(err) 18 } 19 defer client.Disconnect(context.TODO()) 20 21 // set namespace 22 collection := client.Database("sample_mflix").Collection("movies") 23 24 // define pipeline stages 25 searchStage := bson.D{{Key: "$search", Value: bson.M{ 26 "index": "default", 27 "compound": bson.M{ 28 "filter": bson.A{ 29 bson.M{ 30 "wildcard": bson.D{ 31 {Key: "path", Value: "title"}, 32 {Key: "query", Value: "Summer*"}, 33 }}, 34 }, 35 "must": bson.A{ 36 bson.M{ 37 "near": bson.M{ 38 "path": "released", 39 "origin": time.Date(2014, time.April, 18, 0, 0, 0, 0, time.UTC), 40 "pivot": 13149000000}}, 41 }, 42 }, 43 "sort": bson.D{{Key: "released", Value: -1}}, 44 }}} 45 46 limitStage := bson.D{{Key: "$limit", Value: 5}} 47 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "_id", Value: 0}, {Key: "title", Value: 1}, {Key: "released", Value: 1}, {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}}}}} 48 49 // run pipeline 50 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage}) 51 if err != nil { 52 panic(err) 53 } 54 55 // print results 56 var results []bson.D 57 if err = cursor.All(context.TODO(), &results); err != nil { 58 panic(err) 59 } 60 for _, result := range results { 61 fmt.Println(result) 62 } 63 } Especifique o
<connection-string>
.
Execute a consulta.
go run sort-by-date.go
[{title Summer Nights} {released 1422403200000} {score 0.348105788230896}] [{title Summertime} {released 1406851200000} {score 0.5917375683784485}] [{title Summer of Blood} {released 1397692800000} {score 0.9934720396995544}] [{title Summer Games} {released 1328659200000} {score 0.15982933342456818}] [{title Summer of Goliath} {released 1310083200000} {score 0.13038821518421173}]
Defina a query.
Crie um novo arquivo chamado
SortByDate.java
e cole o código a seguir:1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 import java.time.Instant; 14 import java.util.Date; 15 16 public class SortByDate { 17 public static void main( String[] args ) { 18 // define query 19 Document agg = 20 new Document("$search", 21 new Document("index", "default") 22 .append("compound", 23 new Document("filter", Arrays.asList(new Document("wildcard", 24 new Document("query", "Summer*") 25 .append("path", "title")))) 26 .append("must", Arrays.asList(new Document("near", 27 new Document("pivot", 13149000000L) 28 .append("path", "released") 29 .append("origin", Date.from(Instant.parse("2014-04-18T00:00:00.000+00:00"))))))) 30 .append("sort", new Document("released", -1))); 31 32 // specify connection 33 String uri = "<connection-string>"; 34 35 // establish connection and set namespace 36 try (MongoClient mongoClient = MongoClients.create(uri)) { 37 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 38 MongoCollection<Document> collection = database.getCollection("movies"); 39 // run query and print results 40 collection.aggregate(Arrays.asList(agg, 41 limit(5), 42 project(fields(exclude("_id"), include("title"), include("released"), computed("score", new Document("$meta", "searchScore")))))) 43 .forEach(doc -> System.out.println(doc.toJson())); 44 } 45 } 46 } Observação
Para executar o código de amostra em seu ambiente Maven, adicione o seguinte código acima das declarações de importação em seu arquivo.
package com.mongodb.drivers; Especifique o
<connection-string>
.
Execute a consulta.
javac SortByDate.java java SortByDate
{"title": "Summer Nights", "released": {"$date": "2015-01-28T00:00:00Z"}, "score": 0.348105788230896} {"title": "Summertime", "released": {"$date": "2014-08-01T00:00:00Z"}, "score": 0.5917375683784485} {"title": "Summer of Blood", "released": {"$date": "2014-04-17T00:00:00Z"}, "score": 0.9934720396995544} {"title": "Summer Games", "released": {"$date": "2012-02-08T00:00:00Z"}, "score": 0.15982933342456818} {"title": "Summer of Goliath", "released": {"$date": "2011-07-08T00:00:00Z"}, "score": 0.13038821518421173}
Defina a query.
Crie um novo arquivo chamado
SortByDate.kt
e cole o código a seguir:1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 import java.time.Instant 8 import java.util.* 9 10 fun main() { 11 // establish connection and set namespace 12 val uri = "<connection-string>" 13 val mongoClient = MongoClient.create(uri) 14 val database = mongoClient.getDatabase("sample_mflix") 15 val collection = database.getCollection<Document>("movies") 16 17 runBlocking { 18 // define query 19 val agg = Document( 20 "\$search", 21 Document("index", "default") 22 .append( 23 "compound", 24 Document( 25 "filter", listOf( 26 Document( 27 "wildcard", 28 Document("query", "Summer*") 29 .append("path", "title") 30 ) 31 ) 32 ) 33 .append( 34 "must", listOf( 35 Document( 36 "near", 37 Document("pivot", 13149000000L) 38 .append("path", "released") 39 .append("origin", Date.from(Instant.parse("2014-04-18T00:00:00.000+00:00"))) 40 ) 41 ) 42 ) 43 ) 44 .append("sort", Document("released", -1)) 45 ) 46 47 // run query and print results 48 val resultsFlow = collection.aggregate<Document>( 49 listOf( 50 agg, 51 limit(5), 52 project(fields( 53 excludeId(), 54 include("title", "released"), 55 computed("score", Document("\$meta", "searchScore")) 56 )) 57 ) 58 ) 59 resultsFlow.collect { println(it) } 60 } 61 mongoClient.close() 62 } Especifique o
<connection-string>
.
Execute a consulta.
kotlin SortByDate.kt
Document{{title=Summer Nights, released=Tue Jan 27 19:00:00 EST 2015, score=0.348105788230896}} Document{{title=Summertime, released=Thu Jul 31 20:00:00 EDT 2014, score=0.5917375683784485}} Document{{title=Summer of Blood, released=Wed Apr 16 20:00:00 EDT 2014, score=0.9934720396995544}} Document{{title=Summer Games, released=Tue Feb 07 19:00:00 EST 2012, score=0.15982933342456818}} Document{{title=Summer of Goliath, released=Thu Jul 07 20:00:00 EDT 2011, score=0.13038821518421173}}
Defina a query.
Crie um novo arquivo chamado
sort-by-date.js
e cole o código a seguir:1 const { MongoClient } = require("mongodb"); 2 3 // Replace the uri string with your MongoDB deployments connection string. 4 const uri = 5 "<connection-string>"; 6 7 const client = new MongoClient(uri); 8 9 async function run() { 10 try { 11 await client.connect(); 12 13 // set namespace 14 const database = client.db("sample_mflix"); 15 const coll = database.collection("movies"); 16 17 // define pipeline 18 const agg = [ 19 {$search: { 20 index: "default", 21 compound: { 22 filter: {wildcard: {query: "Summer*", path: "title"}}, 23 must: [{near: {path: "released", origin: new Date("2014-04-18T00:00:00.000Z"), pivot: 13149000000}}] 24 }, 25 sort: { released: -1 } 26 }}, 27 {$limit: 5}, 28 {$project: {_id: 0, title: 1, released: 1, score: {$meta: "searchScore"}}} 29 ]; 30 31 // run pipeline 32 const result = await coll.aggregate(agg); 33 34 // print results 35 await result.forEach((doc) => console.log(doc)); 36 37 } finally { 38 await client.close(); 39 } 40 } 41 run().catch(console.dir); Especifique o
<connection-string>
.
Execute a consulta.
node sort-by-date.js
{ title: 'Summer Nights', released: 2015-01-28T00:00:00.000Z, score: 0.348105788230896 } { title: 'Summertime', released: 2014-08-01T00:00:00.000Z, score: 0.5917375683784485 } { title: 'Summer of Blood', released: 2014-04-17T00:00:00.000Z, score: 0.9934720396995544 } { title: 'Summer Games', released: 2012-02-08T00:00:00.000Z, score: 0.15982933342456818 } { title: 'Summer of Goliath', released: 2011-07-08T00:00:00.000Z, score: 0.13038821518421173 }
Defina a query.
Crie um novo arquivo chamado
sort-by-date.py
e cole o código a seguir:1 import datetime 2 import pymongo 3 4 # connect to your Atlas cluster 5 client = pymongo.MongoClient('<connection-string>') 6 7 # define pipeline 8 pipeline = [ 9 {'$search': { 10 'index': 'default', 11 'compound': { 12 'filter': {'wildcard': {'query': 'Summer*', 'path': 'title'}}, 13 'must': {'near': { 14 "path": "released", 15 "origin": datetime.datetime(2014, 4, 18, 0, 0, 0, 0), 16 "pivot": 13149000000 17 }}}, 18 'sort': { 'released': -1 }}}, 19 {'$limit': 5}, 20 {'$project': {'_id': 0, 'title': 1, 'released': 1, 'score': {'$meta': 'searchScore'}}} 21 ] 22 23 # run pipeline 24 result = client['sample_mflix']['movies'].aggregate(pipeline) 25 26 # print results 27 for i in result: 28 print(i) Especifique o
<connection-string>
.
Execute a consulta.
python sort-by-date.py
{'title': 'Summer Nights', 'released': datetime.datetime(2015, 1, 28, 0, 0), 'score': 0.348105788230896} {'title': 'Summertime', 'released': datetime.datetime(2014, 8, 1, 0, 0), 'score': 0.5917375683784485} {'title': 'Summer of Blood', 'released': datetime.datetime(2014, 4, 17, 0, 0), 'score': 0.9934720396995544} {'title': 'Summer Games', 'released': datetime.datetime(2012, 2, 8, 0, 0), 'score': 0.15982933342456818} {'title': 'Summer of Goliath', 'released': datetime.datetime(2011, 7, 8, 0, 0), 'score': 0.13038821518421173}
Pesquisa e classificação de números
A seguinte query mostra como classificar os resultados por um campo numérico. Ela usa o operador de faixa para procurar filmes que ganharam 10 ou mais prêmios e, em seguida, classifica os resultados pelo valor do campo numérico em ordem decrescente.
A consulta utiliza os seguintes estágios de pipeline:
Estágio
$search
para pesquisar o campoawards.wins
e classificar os resultados em ordem decrescente.Estágio
$limit
para limitar a saída a5
resultados.Estágio
$project
para excluir todos os campos, excetotitle
eawards.wins
.
Execute a consulta.
Copie e cole a seguinte consulta no Query Editor e, em seguida, clique no botão Search no Query Editor.
[ { "$search": { "range": { "path": "awards.wins", "gte": 10 }, "sort": { "awards.wins": -1, } } } ]
SCORE: 1 _id: "573a13d5f29313caabd9cae7" fullplot: "Based on an incredible true story of one man's fight for survival and …" imdb: Object ... year: 2013 ... awards: Object wins: 267 ... ... SCORE: 1 _id: "573a13c7f29313caabd74a4d" fullplot: "Dr. Ryan Stone (Sandra Bullock) is a brilliant medical engineer on her…" imdb: Object ... year: 2013 ... awards: Object wins: 231 ... ... SCORE: 1 _id: "573a13cbf29313caabd808d2" fullplot: "Dr. Ryan Stone (Sandra Bullock) is a brilliant medical engineer on her…" imdb: Object ... year: 2013 ... awards: Object wins: 231 ... ... SCORE: 1 _id: “573a13dff29313caabdb7adb”" fullplot: "Actor Riggan Thomson is most famous for his movie role from over twent…" imdb: Object ... year: 2014 ... awards: Object wins: 210 ... ... SCORE: 1 _id: "573a13bef29313caabd5c06c" plot: "The life of Mason, from early childhood to his arrival at college." imdb: Object ... runtime: 165 ... awards: Object wins: 185 ... ... SCORE: 1 _id: "573a139ef29313caabcfbd6a" fullplot: "While Frodo & Sam continue to approach Mount Doom to destroy the One R…" imdb: Object ... year: 2003 ... awards: Object wins: 175 ... ... SCORE: 1 _id: "573a13b5f29313caabd447f5" plot: "In rural Texas, welder and hunter Llewelyn Moss discovers the remains …" imdb: Object ... year: 2007 ... awards: Object wins: 172 ... ... SCORE: 1 _id: "573a13c3f29313caabd68d9f" plot: "On a fall night in 2003, Harvard undergrad and computer programming ge…" imdb: Object ... year: 2010 ... awards: Object wins: 171 ... ... SCORE: 1 _id: "573a13c5f29313caabd6ee61" fullplot: "Dom Cobb is a skilled thief, the absolute best in the dangerous art of…" imdb: Object ... year: 2010 ... awards: Object wins: 162 ... ... SCORE: 1 _id: "573a13bdf29313caabd58fd3" plot: "The story of Jamal Malik, an 18 year-old orphan from the slums of Mumb…" imdb: Object ... year: 2008 ... awards: Object wins: 161 ... ...
Para executar a query em mongosh
:
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "range": { 5 "path": "awards.wins", 6 "gte": 10 7 }, 8 "sort": { 9 "awards.wins": -1, 10 } 11 } 12 }, 13 { 14 $limit: 5 15 }, 16 { 17 "$project": { 18 "_id": 0, 19 "title": 1, 20 "awards.wins": 1 21 } 22 } 23 ])
[ { title: '12 Years a Slave', awards: { wins: 267 } }, { title: 'Gravity', awards: { wins: 231 } }, { title: 'Gravity', awards: { wins: 231 } }, { title: 'Birdman: Or (The Unexpected Virtue of Ignorance)', awards: { wins: 210 } }, { title: 'Boyhood', awards: { wins: 185 } } ]
No MongoDB Compass, configure cada um dos seguintes estágios do pipeline selecionando o estágio no menu suspenso e adicionando a query para esse estágio. Clique em Add Stage para adicionar estágios adicionais.
estágio do pipeline | Query | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||
|
| ||||||||||
|
|
Se você habilitou o Auto Preview, o MongoDB Compass exibe os seguintes documentos ao lado da etapa de pipeline do $limit
:
[ { title: '12 Years a Slave', awards: { wins: 267 } }, { title: 'Gravity', awards: { wins: 231 } }, { title: 'Gravity', awards: { wins: 231 } }, { title: 'Birdman: Or (The Unexpected Virtue of Ignorance)', awards: { wins: 210 } }, { title: 'Boyhood', awards: { wins: 185 } } ]
Defina a query.
No seu projeto, substitua o conteúdo do arquivo
Program.cs
pelo código a seguir.1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class SortByNumbers 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define search options 23 var searchOptions = new SearchOptions<MovieDocument>() 24 { 25 Sort = Builders<MovieDocument>.Sort.Descending(movies => movies.Awards.Wins), 26 IndexName = "default" 27 }; 28 29 // define and run pipeline 30 var results = moviesCollection.Aggregate() 31 .Search( 32 Builders<MovieDocument>.Search.Range(movie => movie.Awards.Wins, SearchRangeBuilder.Gte(10)), searchOptions) 33 .Project<MovieDocument>(Builders<MovieDocument>.Projection 34 .Exclude(movie => movie.Id) 35 .Include(movie => movie.Title) 36 .Include(movie => movie.Awards.Wins)) 37 .Limit(5) 38 .ToList(); 39 40 // print results 41 foreach (var movie in results) 42 { 43 Console.WriteLine(movie.ToJson()); 44 } 45 } 46 } 47 48 [ ]49 public class MovieDocument 50 { 51 [ ]52 public ObjectId Id { get; set; } 53 public string Title { get; set; } 54 public Award Awards { get; set; } 55 } 56 57 public class Award 58 { 59 [ ]60 public int Wins { get; set; } 61 } Especifique o
<connection-string>
.
Execute a consulta.
dotnet run Program.cs
{ "title" : "12 Years a Slave", "awards" : { "wins" : 267 } } { "title" : "Gravity", "awards" : { "wins" : 231 } } { "title" : "Gravity", "awards" : { "wins" : 231 } } { "title" : "Birdman: Or (The Unexpected Virtue of Ignorance)", "awards" : { "wins" : 210 } } { "title" : "Boyhood", "awards" : { "wins" : 185 } }
Defina a query.
Crie um novo arquivo chamado
sort-by-numbers.go
e cole o código a seguir:1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/v2/bson" 8 "go.mongodb.org/mongo-driver/v2/mongo" 9 "go.mongodb.org/mongo-driver/v2/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("sample_mflix").Collection("movies") 22 23 // define pipeline stages 24 searchStage := bson.D{{Key: "$search", Value: bson.D{ 25 {Key: "index", Value: "default"}, 26 {Key: "range", Value: bson.D{ 27 {Key: "path", Value: "awards.wins"}, 28 {Key: "gte", Value: 10}, 29 }}, 30 {Key: "sort", Value: bson.D{{Key: "awards.wins", Value: -1}}}, 31 }}} 32 limitStage := bson.D{{Key: "$limit", Value: 5}} 33 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "title", Value: 1}, {Key: "awards.wins", Value: 1}, {Key: "_id", Value: 0}}}} 34 35 // run pipeline 36 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage}) 37 if err != nil { 38 panic(err) 39 } 40 41 // print results 42 var results []bson.D 43 if err = cursor.All(context.TODO(), &results); err != nil { 44 panic(err) 45 } 46 for _, result := range results { 47 fmt.Println(result) 48 } 49 } Especifique o
<connection-string>
.
Defina a query.
Crie um novo arquivo chamado
SortByNumbers.java
e cole o código a seguir:1 import java.util.Arrays; 2 3 import static com.mongodb.client.model.Aggregates.limit; 4 import static com.mongodb.client.model.Aggregates.project; 5 import static com.mongodb.client.model.Projections.excludeId; 6 import static com.mongodb.client.model.Projections.fields; 7 import static com.mongodb.client.model.Projections.include; 8 import com.mongodb.client.MongoClient; 9 import com.mongodb.client.MongoClients; 10 import com.mongodb.client.MongoCollection; 11 import com.mongodb.client.MongoDatabase; 12 import org.bson.Document; 13 14 public class SortByNumbers { 15 public static void main( String[] args ) { 16 // define query 17 Document agg = 18 new Document("$search", 19 new Document("index", "default") 20 .append("range", 21 new Document("path", "awards.wins") 22 .append("gte", 10L)) 23 .append("sort", 24 new Document("awards.wins", -1L))); 25 26 // specify connection 27 String uri = "<connection-string>"; 28 29 // establish connection and set namespace 30 try (MongoClient mongoClient = MongoClients.create(uri)) { 31 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 32 MongoCollection<Document> collection = database.getCollection("movies"); 33 34 // run query and print results 35 collection.aggregate(Arrays.asList(agg, 36 limit(5), 37 project(fields(excludeId(), include("title"), include("awards.wins"))))) 38 .forEach(doc -> System.out.println(doc.toJson())); 39 } 40 } 41 } Observação
Para executar o código de amostra em seu ambiente Maven, adicione o seguinte código acima das declarações de importação em seu arquivo.
package com.mongodb.drivers; Especifique o
<connection-string>
.
Execute a consulta.
javac SortByNumbers.java java SortByNumbers
{"title": "12 Years a Slave", "awards": {"wins": 267}} {"title": "Gravity", "awards": {"wins": 231}} {"title": "Gravity", "awards": {"wins": 231}} {"title": "Birdman: Or (The Unexpected Virtue of Ignorance)", "awards": {"wins": 210}} {"title": "Boyhood", "awards": {"wins": 185}}
Defina a query.
Crie um novo arquivo chamado
SortByNumbers.kt
e cole o código a seguir:1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("sample_mflix") 13 val collection = database.getCollection<Document>("movies") 14 15 runBlocking { 16 // define query 17 val agg = Document( 18 "\$search", 19 Document("index", "default") 20 .append( 21 "range", 22 Document("path", "awards.wins") 23 .append("gte", 10L) 24 ) 25 .append( 26 "sort", 27 Document("awards.wins", -1L) 28 ) 29 ) 30 31 // run query and print results 32 val resultsFlow = collection.aggregate<Document>( 33 listOf( 34 agg, 35 limit(5), 36 project(fields( 37 excludeId(), 38 include("title", "awards.wins") 39 )) 40 ) 41 ) 42 resultsFlow.collect { println(it) } 43 } 44 mongoClient.close() 45 } Especifique o
<connection-string>
.
Execute a consulta.
kotlin SortByNumbers.kt
Document{{title=12 Years a Slave, awards=Document{{wins=267}}}} Document{{title=Gravity, awards=Document{{wins=231}}}} Document{{title=Gravity, awards=Document{{wins=231}}}} Document{{title=Birdman: Or (The Unexpected Virtue of Ignorance), awards=Document{{wins=210}}}} Document{{title=Boyhood, awards=Document{{wins=185}}}}
Defina a query.
Crie um novo arquivo chamado
sort-by-numbers.js
e cole o código a seguir:1 const { MongoClient } = require("mongodb"); 2 3 // Replace the uri string with your MongoDB deployments connection string. 4 const uri = 5 "<connection-string>"; 6 7 const client = new MongoClient(uri); 8 9 async function run() { 10 try { 11 await client.connect(); 12 13 // set namespace 14 const database = client.db("sample_mflix"); 15 const coll = database.collection("movies"); 16 17 // define pipeline 18 const agg = [ 19 { 20 '$search': { 21 'index': 'default', 22 'range': { 23 'path': 'awards.wins', 24 'gte': 10 25 }, 26 'sort': { 27 'awards.wins': -1 28 } 29 } 30 }, { 31 '$limit': 5 32 }, { 33 '$project': { 34 '_id': 0, 35 'title': 1, 36 'awards.wins': 1 37 } 38 } 39 ]; 40 41 // run pipeline 42 const result = await coll.aggregate(agg); 43 44 // print results 45 await result.forEach((doc) => console.log(doc)); 46 47 } finally { 48 await client.close(); 49 } 50 } 51 run().catch(console.dir); Especifique o
<connection-string>
.
Execute a consulta.
node sort-by-numbers.js
{ title: '12 Years a Slave', awards: { wins: 267 } } { title: 'Gravity', awards: { wins: 231 } } { title: 'Gravity', awards: { wins: 231 } } { title: 'Birdman: Or (The Unexpected Virtue of Ignorance)', awards: { wins: 210 } } { title: 'Boyhood', awards: { wins: 185 } }
Defina a query.
Crie um novo arquivo chamado
sort-by-numbers.py
e cole o código a seguir:1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'default', 11 'range': { 12 'path': 'awards.wins', 13 'gte': 10 14 }, 15 'sort': { 16 'awards.wins': -1 17 } 18 } 19 }, { 20 '$limit': 5 21 }, { 22 '$project': {'_id': 0, 'title': 1, 'awards.wins': 1 23 } 24 } 25 ] 26 27 # run pipeline 28 result = client['sample_mflix']['movies'].aggregate(pipeline) 29 30 # print results 31 for i in result: 32 print(i) Especifique o
<connection-string>
.
Execute a consulta.
python sort-by-numbers.py
{'title': '12 Years a Slave', 'awards': {'wins': 267}} {'title': 'Gravity', 'awards': {'wins': 231}} {'title': 'Gravity', 'awards': {'wins': 231}} {'title': 'Birdman: Or (The Unexpected Virtue of Ignorance)', 'awards': {'wins': 210}} {'title': 'Boyhood', 'awards': {'wins': 185}}
Pesquisa e classificação de strings
Exemplo básico
A query a seguir no namespace sample_mflix.movies
usa o estágio $search
para fazer o seguinte:
Procure filmes que tenham o termo
country
no título.Classifique os resultados em ordem crescente usando a opção
sort
.
A query usa o estágio $limit
para limitar a saída a 5
documentos. Ele também utiliza o estágio $project
para fazer o seguinte:
Omitir todos os campos exceto
title
nos resultados.Adicione um campo denominado
score
.
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "country" }, "sort": { "title": 1 } } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "score": { "$meta": "searchScore" } } } ])
[ { title: 'A Country Called Home', score: 2.536633253097534 }, { title: 'A Month in the Country', score: 2.258953094482422 }, { title: 'A Quiet Place in the Country', score: 2.0360684394836426 }, { title: 'A Sunday in the Country', score: 2.258953094482422 }, { title: 'Another Country', score: 3.3635599613189697 } ]
Exemplo de pesquisa e classificação composta com curingas
A seguinte consulta mostra como consultar e classificar os resultados por um campo de cadeia de caracteres. Procura títulos que começam com Prance
ou Prince
e classifica os resultados pelo campo title
em ordem crescente.
A consulta utiliza os seguintes estágios de pipeline:
$search
para pesquisar o campotitle
utilizando a cláusulashould
com o operador wildcard para pesquisar títulos que começam comPrance
ePrince
. A consulta também especifica que os resultados devem ser classificados pelo campotitle
em ordem crescente.Estágio
$limit
para limitar a saída a5
resultados.$project
estágio para:Excluir todos os campos, exceto
title
.Adicione um campo denominado
score
.
[ { $search: { "compound": { "should": [{ "wildcard": { "query": ["Prance*"], "path": "title", "allowAnalyzedField": true } }, { "wildcard": { "query": ["Prince*"], "path": "title", "allowAnalyzedField": true } }] }, "sort": { "title": 1 } } } ]
SCORE: 1 _id: "573a1398f29313caabceb98e" plot: "A farm girl nurses a wounded reindeer she believes is one of Santa's, …" genres: Array runtime: 103 ... title: "Prancer" ... SCORE: 1 _id: "573a13a5f29313caabd14f54" plot: "Preteen brothers from a broken marriage live with their mother, Denise…" genres: Array runtime: 91 ... title: "Prancer Returns" ... SCORE: 1 _id: "573a13f5f29313caabde3755" plot: "A troubled teenager attempts to conquer the love of his life by becomi…" genres: Array runtime: 78 ... title: "Prince" ... SCORE: 1 _id: "573a13d8f29313caabda665f" fullplot: "Two highway road workers spend the summer of 1988 away from their city…" imdb: Object year: 2013 ... title: "Prince Avalanche" ... SCORE: 1 _id: "573a13bdf29313caabd5898a" plot: "A New York street drama about the lives of immigrants in America seeki…" genres: Array runtime: 70 ... title: "Prince of Broadway" ... SCORE: 1 _id: "573a1398f29313caabcea967" fullplot: "A sinister secret has been kept in the basement of an abandoned Los An…" imdb: Object year: 1987 ... title: "Prince of Darkness" ... SCORE: 1 _id: "573a1393f29313caabcde40d" plot: "An unscrupulous agent for the Borgias suffers a change of heart when a…" genres: Array runtime: 107 ... title: "Princess of Foxes" ... SCORE: 1 _id: "573a13b5f29313caabd43816" plot: "A young fugitive prince and princess must stop a villain who unknowing…" genres: Array runtime: 116 ... title: "Prince of Persia: The Sands of Time" ... SCORE: 1 _id: "573a1397f29313caabce8081" plot: "A New York City narcotics detective reluctantly agrees to cooperate wi…" genres: Array runtime: 167 ... title: "Prince of the City" ... SCORE: 1 _id: "573a13a2f29313caabd0a767" plot: "Six old-style funny silhouetted fairy tales for not so-old-style peopl…" genres: Array runtime: 70 ... title: "Princes and Princesses" ...
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O Search Tester pode não exibir todos os campos nos documentos que ele retorna. Para exibir todos os campos, incluindo o campo que você especifica no caminho da query, expanda o documento nos resultados.
1 db.movies.aggregate([{ 2 $search: { 3 "index": "default", 4 "compound": { 5 "should": [{ 6 "wildcard": { 7 "query": ["Prance*"], 8 "path": "title", 9 "allowAnalyzedField": true 10 } 11 }, 12 { 13 "wildcard": { 14 "query": ["Prince*"], 15 "path": "title", 16 "allowAnalyzedField": true 17 } 18 }] 19 }, 20 "sort": { 21 "title": 1 22 } 23 }}, 24 { 25 $limit: 5 26 }, 27 { 28 $project: { 29 "_id": 0, 30 "title": 1, 31 "score": { "$meta": "searchScore" } 32 } 33 } 34 ])
[ { title: 'Prancer', score: 1 }, { title: 'Prancer Returns', score: 1 }, { title: 'Prince', score: 1 }, { title: 'Prince Avalanche', score: 1 }, { title: 'Prince of Broadway', score: 1 } ]
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
estágio do pipeline | Query | ||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||||||||||||
|
| ||||||||||||||||||||
|
|
Se você habilitou o Auto Preview, o MongoDB Compass exibe os seguintes documentos ao lado da etapa de pipeline do $project
:
{ title: 'Prancer', score: 1 }, { title: 'Prancer Returns', score: 1 }, { title: 'Prince', score: 1 }, { title: 'Prince Avalanche', score: 1 }, { title: 'Prince of Boradway', score: 1 }
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O exemplo de código executa as seguintes tarefas:
Importa pacotes e dependências do
mongodb
.Estabelece uma conexão com seu cluster.
A consulta utiliza os seguintes estágios de pipeline:
$search
para pesquisar o campotitle
utilizando a cláusulashould
com o operador wildcard para pesquisar títulos que começam comPrance
ePrince
. A consulta também especifica que os resultados devem ser classificados pelo campotitle
em ordem crescente.Estágio
$limit
para limitar a saída a5
resultados.$project
estágio para:Excluir todos os campos, exceto
title
.Adicione um campo denominado
score
.
Itera sobre o cursor para imprimir os documentos que correspondem à consulta.
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class SortByStrings 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new CamelCaseElementNameConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var mflixDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = mflixDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define search options 23 var searchOptions = new SearchOptions<MovieDocument>() 24 { 25 Sort = Builders<MovieDocument>.Sort.Ascending(movie => movie.Title), 26 IndexName = "default" 27 }; 28 29 // define and run pipeline 30 var results = moviesCollection.Aggregate() 31 .Search(Builders<MovieDocument>.Search.Compound() 32 .Should(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Prance*", true )) 33 .Should(Builders<MovieDocument>.Search.Wildcard(movie => movie.Title, "Prince*" )), searchOptions) 34 .Project<MovieDocument>(Builders<MovieDocument>.Projection 35 .Include(movie => movie.Title) 36 .Exclude(movie => movie.Id) 37 .MetaSearchScore(movie => movie.Score)) 38 .Limit(5) 39 .ToList(); 40 41 // print results 42 foreach (var movie in results) 43 { 44 Console.WriteLine(movie.ToJson()); 45 } 46 } 47 } 48 49 [ ]50 public class MovieDocument 51 { 52 [ ]53 public ObjectId Id { get; set; } 54 public string Title { get; set; } 55 public double Score { get; set; } 56 }
{ "title" : "Prancer", "score" : 1.0 } { "title" : "Prancer Returns", "score" : 1.0 } { "title" : "Prince", "score" : 1.0 } { "title" : "Prince Avalanche", "score" : 1.0 } { "title" : "Prince of Broadway", "score" : 1.0 }
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O exemplo de código executa as seguintes tarefas:
Importa pacotes e dependências do
mongodb
.Estabelece uma conexão com seu cluster.
Itera sobre o cursor para imprimir os documentos que correspondem à consulta.
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/v2/bson" 8 "go.mongodb.org/mongo-driver/v2/mongo" 9 "go.mongodb.org/mongo-driver/v2/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("sample_mflix").Collection("movies") 22 23 // define pipeline stages 24 searchStage := bson.D{{Key: "$search", Value: bson.M{ 25 "index": "default", 26 "compound": bson.M{ 27 "should": bson.A{ 28 bson.M{ 29 "wildcard": bson.D{ 30 {Key: "path", Value: "title"}, 31 {Key: "query", Value: "Prance*"}, 32 {Key: "allowAnalyzedField", Value: true}, 33 }}, 34 bson.M{ 35 "wildcard": bson.D{ 36 {Key: "path", Value: "title"}, 37 {Key: "query", Value: "Prince*"}, 38 {Key: "allowAnalyzedField", Value: true}, 39 }}, 40 }, 41 }, 42 "sort": bson.D{{Key: "title", Value: 1}}, 43 }}} 44 45 limitStage := bson.D{{Key: "$limit", Value: 5}} 46 projectStage := bson.D{{Key: "$project", Value: bson.D{{Key: "title", Value: 1}, {Key: "_id", Value: 0}, {Key: "score", Value: bson.D{{Key: "$meta", Value: "searchScore"}}}}}} 47 48 // run pipeline 49 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage}) 50 if err != nil { 51 panic(err) 52 } 53 54 // print results 55 var results []bson.D 56 if err = cursor.All(context.TODO(), &results); err != nil { 57 panic(err) 58 } 59 for _, result := range results { 60 fmt.Println(result) 61 } 62 }
[{title Prancer} {score 1}] [{title Prancer Returns} {score 1}] [{title Prince} {score 1}] [{title Prince Avalanche} {score 1}] [{title Prince of Broadway} {score 1}]
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O exemplo de código executa as seguintes tarefas:
Importa pacotes e dependências do
mongodb
.Estabelece uma conexão com seu cluster.
Itera sobre o cursor para imprimir os documentos que correspondem à consulta.
1 import java.util.Arrays; 2 import java.util.List; 3 4 import static com.mongodb.client.model.Aggregates.limit; 5 import static com.mongodb.client.model.Aggregates.project; 6 import static com.mongodb.client.model.Projections.*; 7 import com.mongodb.client.MongoClient; 8 import com.mongodb.client.MongoClients; 9 import com.mongodb.client.MongoCollection; 10 import com.mongodb.client.MongoDatabase; 11 import org.bson.Document; 12 13 import java.util.Date; 14 15 public class SortByString { 16 public static void main( String[] args ) { 17 // define clause 18 List<Document> shouldClause = 19 List.of( 20 new Document( 21 "wildcard", 22 new Document("query", "Prance*") 23 .append("path", "title") 24 .append("allowAnalyzedField", true)), 25 new Document( 26 "wildcard", 27 new Document("query", "Prince*") 28 .append("path", "title") 29 .append("allowAnalyzedField", true))); 30 31 // define query 32 Document agg = 33 new Document( 34 "$search", 35 new Document("index", "default") 36 .append("compound", 37 new Document("should", shouldClause)) 38 .append("sort", new Document("title", 1L))); 39 40 // specify connection 41 String uri = "<connection-string>"; 42 43 // establish connection and set namespace 44 try (MongoClient mongoClient = MongoClients.create(uri)) { 45 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 46 MongoCollection<Document> collection = database.getCollection("movies"); 47 48 // run query and print results 49 collection.aggregate(Arrays.asList(agg, 50 limit(5), 51 project(fields(excludeId(), include("title"), computed("score", new Document("$meta", "searchScore")))))) 52 .forEach(doc -> System.out.println(doc.toJson())); 53 } 54 } 55 }
{"title": "Prancer", "score": 1.0} {"title": "Prancer Returns", "score": 1.0} {"title": "Prince", "score": 1.0} {"title": "Prince Avalanche", "score": 1.0} {"title": "Prince of Broadway", "score": 1.0}
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O exemplo de código executa as seguintes tarefas:
Importa pacotes e dependências do
mongodb
.Estabelece uma conexão com seu cluster.
Imprime os documentos que correspondem à query da instância
AggregateFlow
.
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("sample_mflix") 13 val collection = database.getCollection<Document>("movies") 14 15 runBlocking { 16 // define clause 17 val shouldClause = listOf( 18 Document("wildcard", Document("query", "Prance*") 19 .append("path", "title") 20 .append("allowAnalyzedField", true)), 21 Document("wildcard", Document("query", "Prince*") 22 .append("path", "title") 23 .append("allowAnalyzedField", true)) 24 ) 25 26 // define query 27 val agg = Document( 28 "\$search", 29 Document("index", "default") 30 .append( 31 "compound", 32 Document("should", shouldClause) 33 ) 34 .append("sort", Document("title", 1L)) 35 ) 36 37 // run query and print results 38 val resultsFlow = collection.aggregate<Document>( 39 listOf( 40 agg, 41 limit(5), 42 project(fields( 43 excludeId(), 44 include("title"), 45 computed("score", Document("\$meta", "searchScore")) 46 )) 47 ) 48 ) 49 resultsFlow.collect { println(it) } 50 } 51 mongoClient.close() 52 }
Document{{title=Prancer, score=1.0}} Document{{title=Prancer Returns, score=1.0}} Document{{title=Prince, score=1.0}} Document{{title=Prince Avalanche, score=1.0}} Document{{title=Prince of Broadway, score=1.0}}
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O exemplo de código executa as seguintes tarefas:
Importa
mongodb
, o driver do Node.js da MongoDB.Cria uma instância da classe
MongoClient
para estabelecer uma conexão com seu cluster.A consulta utiliza os seguintes estágios de pipeline:
$search
para pesquisar o campotitle
utilizando a cláusulashould
com o operador wildcard para pesquisar títulos que começam comPrance
ePrince
. A consulta também especifica que os resultados devem ser classificados pelo campotitle
em ordem crescente.Estágio
$limit
para limitar a saída a5
resultados.$project
estágio para:Excluir todos os campos, exceto
title
.Adicione um campo denominado
score
.
Itera sobre o cursor para imprimir os documentos que correspondem à consulta.
1 const { MongoClient } = require("mongodb"); 2 3 // Replace the uri string with your MongoDB deployments connection string. 4 const uri = 5 "<connection-string>"; 6 7 const client = new MongoClient(uri); 8 9 async function run() { 10 try { 11 await client.connect(); 12 13 // set namespace 14 const database = client.db("sample_mflix"); 15 const coll = database.collection("movies"); 16 17 // define pipeline 18 const agg = [ 19 { 20 '$search': { 21 'compound': { 22 'should': [ 23 { 24 'wildcard': { 25 'query': [ 26 'Prance*' 27 ], 28 'path': 'title', 29 'allowAnalyzedField': true 30 } 31 }, { 32 'wildcard': { 33 'query': [ 34 'Prince*' 35 ], 36 'path': 'title', 37 'allowAnalyzedField': true 38 } 39 } 40 ] 41 }, 42 'sort': { 'title': 1 } 43 } 44 }, { 45 '$limit': 5 46 }, { 47 '$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'} 48 } 49 } 50 ]; 51 52 // run pipeline 53 const result = await coll.aggregate(agg); 54 55 // print results 56 await result.forEach((doc) => console.log(doc)); 57 58 } finally { 59 await client.close(); 60 } 61 } 62 run().catch(console.dir);
{ title: 'Prancer', score: 1 } { title: 'Prancer Returns', score: 1 } { title: 'Prince', score: 1 } { title: 'Prince Avalanche', score: 1 } { title: 'Prince of Broadway', score: 1 }
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
O seguinte exemplo de código:
Importa
pymongo
, o driver Python do MongoDB e o módulodns
, que é necessário para conectarpymongo
aAtlas
usando uma string de conexão da lista de sementes de DNS.Cria uma instância da classe
MongoClient
para estabelecer uma conexão com seu cluster.A consulta utiliza os seguintes estágios de pipeline:
$search
para pesquisar o campotitle
utilizando a cláusulashould
com o operador wildcard para pesquisar títulos que começam comPrance
ePrince
. A consulta também especifica que os resultados devem ser classificados pelo campotitle
em ordem crescente.Estágio
$limit
para limitar a saída a5
resultados.$project
estágio para:Excluir todos os campos, exceto
title
.Adicione um campo denominado
score
.
Itera sobre o cursor para imprimir os documentos que correspondem à consulta.
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 {'$search': { 9 'compound': { 10 'should': [{'wildcard': {'query': 'Prance*', 'path': 'title', 'allowAnalyzedField': True}}, 11 {'wildcard': {'query': 'Prince*', 'path': 'title', 'allowAnalyzedField': True}}] 12 }, 13 'sort': { 'title': 1 }}}, 14 {'$limit': 5}, 15 {'$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'}}} 16 ] 17 18 # run pipeline 19 result = client['sample_mflix']['movies'].aggregate(pipeline) 20 21 # print results 22 for i in result: 23 print(i)
{'title': 'Prancer', 'score': 1.0} {'title': 'Prancer Returns', 'score': 1.0} {'title': 'Prince', 'score': 1.0} {'title': 'Prince Avalanche', 'score': 1.0} {'title': 'Prince of Broadway', 'score': 1.0}
Os resultados do MongoDB Search contêm documentos com títulos de filmes que começam com Prance
e Prince
. O MongoDB Search retorna títulos com Prance
seguido de Prince
porque o MongoDB Search classifica documentos pelo campo title
em ordem crescente.
Exemplo de classificação sem distinção entre maiúsculas e minúsculas
A seguinte query mostra como classificar os resultados independentemente das letras maiúsculas e minúsculas. Ele usa o operador text para pesquisar filmes que tenham o termo train
no campo title
e, em seguida, classifica os resultados pelo valor do campo title
em ordem crescente.
A consulta especifica um estágio $limit
para limitar os documentos nos resultados a 5
e um estágio $project
para fazer o seguinte:
Inclua somente os campos
_id
,title
eawards
nos resultados.Adicione um campo chamado pontuação nos resultados.
[ { "$search": { "text": { "path": "title", "query": "train", }, "sort": { "title": 1 } } } ]
SCORE: 3.317898988723755 _id: "573a139cf29313caabcf662c" plot: "A train filled with atomic devices threatens to destroy the city of De…" genres: Array runtime: 122 SCORE: 3.317898988723755 _id: "64de50ae2932de4dd3203061" genres: Array title: "atomic train" awards: Object SCORE: 2.228306293487549 _id: "573a13bbf29313caabd52ff4" fullplot: "Long ago up North on the Island of Berk, the young Viking, Hiccup, wan…" imdb: Object year: 2010 SCORE: 2.228306293487549 _id: "64de50da2932de4dd3204393" genres: Array title: "how to train your dragon" awards: Object SCORE: 2.008449077606201 _id: "573a13ccf29313caabd83281" plot: "When Hiccup and Toothless discover an ice cave that is home to hundred…" genres: Array runtime: 102 SCORE: 1.4400973320007324 _id: "573a13b1f29313caabd36490" plot: "The life and times of Howard Zinn: the historian, activist, and author…" genres: Array runtime: 78 SCORE: 2.228306293487549 _id: "573a1394f29313caabce0fb4" plot: "A marshal tries to bring the son of an old friend, an autocratic cattl…" genres: Array runtime: 95 SCORE: 2.8528976440429688 _id: "573a13c8f29313caabd78a6b" plot: "A couple embarks on a journey home for Chinese new year along with 130…" genres: Array runtime: 85 SCORE: 2.502213716506958 _id: "573a13baf29313caabd50811" plot: "Two thugs from the Perth suburb of Midland catch the last train to Fre…" genres: Array runtime: 89 SCORE: 2.502213716506958 _id: "573a13a7f29313caabd1b667" fullplot: "A teacher and a gangster meet by chance in a small town pharmacy. As a…" imdb: Object year: 2002
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
SCORE: 3.317898988723755 _id: "573a139cf29313caabcf662c" plot: "A train filled with atomic devices threatens to destroy the city of De…" genres: Array runtime: 122 SCORE: 2.2382168769836426 _id: "573a13bbf29313caabd52ff4" fullplot: "Long ago up North on the Island of Berk, the young Viking, Hiccup, wan…" imdb: object year: 2010 SCORE: 2.008449077606201 _id: "573a13ccf29313caabd83281" plot: "When Hiccup and Toothless discover an ice cave that is home to hundred…" genres: Array runtime: 102 SCORE: 1.4400973320007324 _id: "573a13b1f29313caabd36490" plot: "The life and times of Howard Zinn: the historian, activist, and author…" genres: Array runtime: 78 SCORE: 2.8528976440429688 _id: "573a13c8f29313caabd78a6b" plot: "A couple embarks on a journey home for Chinese new year along with 130…" genres: Array runtime: 85 SCORE: 2.228306293487549 _id: "573a1394f29313caabce0fb4" plot: "A marshal tries to bring the son of an old friend, an autocratic cattl…" genres: Array runtime: 95 SCORE: 2.502213716506958 _id: "573a13baf29313caabd50811" plot: "Two thugs from the Perth suburb of Midland catch the last train to Fre…" genres: Array runtime: 89 SCORE: 2.502213716506958 _id: "573a13a7f29313caabd1b667" fullplot: "A teacher and a gangster meet by chance in a small town pharmacy. As a…" imdb: Object year: 2002 SCORE: 3.3326687812805176 _id: "573a139af29313caabcef573" plot: "A vengeful New York transit cop decides to steal a trainload of subway…" genres: Array runtime: 110 SCORE: 3.3326687812805176 _id: "573a1398f29313caabceb8f2" plot: "Three stories are connected by a Memphis hotel and the spirit of Elvis…" genres: Array runtime: 110
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
db.movies.aggregate( { "$search": { "index": "default", "text": { "path": "title", "query": "train", }, "sort": { "title": 1 } } }, { "$limit": 5 }, { "$project": { "_id": 1, "title": 1, "awards": 1, "score": { $meta: "searchScore" } } } )
[ { _id: ObjectId("573a139cf29313caabcf662c"), title: 'Atomic Train', awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' }, score: 3.317898988723755 }, { _id: ObjectId("64de50ae2932de4dd3203061"), title: 'atomic train', awards: { wins: 1, nominations: 1 }, score: 3.317898988723755 }, { _id: ObjectId("573a13bbf29313caabd52ff4"), title: 'How to Train Your Dragon', awards: { wins: 32, nominations: 51, text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.' }, score: 2.228306293487549 }, { _id: ObjectId("64de50da2932de4dd3204393"), title: 'how to train your dragon', awards: { wins: 32, nominations: 51 }, score: 2.228306293487549 }, { _id: ObjectId("573a13ccf29313caabd83281"), title: 'How to Train Your Dragon 2', awards: { wins: 18, nominations: 52, text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.' }, score: 2.008449077606201 } ]
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
[ { _id: ObjectId("573a139cf29313caabcf662c"), title: 'Atomic Train', awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' }, score: 3.3326687812805176 }, { _id: ObjectId("573a13bbf29313caabd52ff4"), title: 'How to Train Your Dragon', awards: { wins: 32, nominations: 51, text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.' }, score: 2.2382168769836426 }, { _id: ObjectId("573a13ccf29313caabd83281"), title: 'How to Train Your Dragon 2', awards: { wins: 18, nominations: 52, text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.' }, score: 2.0173802375793457 }, { _id: ObjectId("573a13b1f29313caabd36490"), title: "Howard Zinn: You Can't Be Neutral on a Moving Train", awards: { wins: 1, nominations: 0, text: '1 win.' }, score: 1.446497917175293 }, { _id: ObjectId("573a13c8f29313caabd78a6b"), title: 'Last Train Home', awards: { wins: 14, nominations: 9, text: '14 wins & 9 nominations.' }, score: 2.8655927181243896 } ]
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
estágio do pipeline | Query | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
| ||||||||||
|
| ||||||||||
|
|
Se você habilitou Auto Preview, o MongoDB Compass exibe os seguintes documentos ao lado da etapa de pipeline do $project
:
_id: ObjectId('573a139cf29313caabcf662c') title: 'Atomic Train' awards: Object score: 3.317898988723755 _id: ObjectId("64de50ae2932de4dd3203061") title: 'atomic train' awards: Object score: 3.317898988723755 _id: ObjectId('573a13bbf29313caabd52ff4') title: 'How to Train Your Dragon' awards: Object score: 2.228306293487549 _id: ObjectId("64de50da2932de4dd3204393"), title: 'how to train your dragon' awards: score: 2.228306293487549 _id: ObjectId('573a13ccf29313caabd83281') title: 'How to Train Your Dragon 2' awards: object score: 2.0173802375793457
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
1 using MongoDB.Bson; 2 using MongoDB.Bson.Serialization.Attributes; 3 using MongoDB.Bson.Serialization.Conventions; 4 using MongoDB.Driver; 5 using MongoDB.Driver.Search; 6 7 public class CaseInsensitiveSort 8 { 9 private const string MongoConnectionString = "<connection-string>"; 10 11 public static void Main(string[] args) 12 { 13 // allow automapping of the camelCase database fields to our MovieDocument 14 var camelCaseConvention = new ConventionPack { new camelCaseConvention() }; 15 ConventionRegistry.Register("CamelCase", camelCaseConvention, type => true); 16 17 // connect to your Atlas cluster 18 var mongoClient = new MongoClient(MongoConnectionString); 19 var yourDatabase = mongoClient.GetDatabase("sample_mflix"); 20 var moviesCollection = yourDatabase.GetCollection<MovieDocument>("movies"); 21 22 // define options for search 23 var searchOptions = new SearchOptions<MovieDocument>() { 24 Sort = Builders<MovieDocument>.Sort.Ascending(movie => movie.Title), 25 IndexName = "default" 26 }; 27 28 // define and run pipeline 29 var results = moviesCollection.Aggregate() 30 .Search(Builders<MovieDocument>.Search.Text(movie => movie.Title, "train"), searchOptions) 31 .Limit (5) 32 .Project<MovieDocument>(Builders<MovieDocument>.Projection 33 .Include(movie => movie.Id) 34 .Include(movie => movie.Title) 35 .Include(movie => movie.Awards) 36 .MetaSearchScore(movie => movie.Score)) 37 .ToList(); 38 39 // print results 40 foreach (var movie in results) 41 { 42 Console.WriteLine(movie.ToJson()); 43 } 44 } 45 } 46 47 [ ]48 public class MovieDocument 49 { 50 [ ]51 public ObjectId Id { get; set; } 52 public string Title { get; set; } 53 public Award Awards { get; set; } 54 public double Score { get; set; } 55 } 56 57 [ ]58 public class Award 59 { 60 public int Wins { get; set; } 61 public int Nominations { get; set; } 62 }
{ "_id" : ObjectId("573a139cf29313caabcf662c"), "title" : "Atomic Train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035578727722168 } { "_id" : ObjectId("64de50ae2932de4dd3203061"), "title" : "atomic train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035578727722168 } { "_id" : ObjectId("573a13bbf29313caabd52ff4"), "title" : "How to Train Your Dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186923027038574 } { "_id" : ObjectId("64de50da2932de4dd3204393"), "title" : "how to train your dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186923027038574 } { "_id" : ObjectId("573a13ccf29313caabd83281"), "title" : "How to Train Your Dragon 2", "awards" : { "wins" : 18, "nominations" : 52 }, "score" : 1.9997868537902832 }
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
{ "_id" : ObjectId("573a139cf29313caabcf662c"), "title" : "Atomic Train", "awards" : { "wins" : 1, "nominations" : 1 }, "score" : 3.3035225868225098 } { "_id" : ObjectId("573a13bbf29313caabd52ff4"), "title" : "How to Train Your Dragon", "awards" : { "wins" : 32, "nominations" : 51 }, "score" : 2.2186522483825684 } { "_id" : ObjectId("573a13ccf29313caabd83281"), "title" : "How to Train Your Dragon 2", "awards" : { "wins" : 18, "nominations" : 52 }, "score" : 1.9997482299804688 } { "_id" : ObjectId("573a13b1f29313caabd36490"), "title" : "Howard Zinn: You Can't Be Neutral on a Moving Train", "awards" : { "wins" : 1, "nominations" : 0 }, "score" : 1.4338588714599609 } { "_id" : ObjectId("573a13c8f29313caabd78a6b"), "title" : "Last Train Home", "awards" : { "wins" : 14, "nominations" : 9 }, "score" : 2.8405368328094482 }
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 7 "go.mongodb.org/mongo-driver/bson" 8 "go.mongodb.org/mongo-driver/mongo" 9 "go.mongodb.org/mongo-driver/mongo/options" 10 ) 11 12 func main() { 13 // connect to your Atlas cluster 14 client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI("<connection-string>")) 15 if err != nil { 16 panic(err) 17 } 18 defer client.Disconnect(context.TODO()) 19 20 // set namespace 21 collection := client.Database("sample_mflix").Collection("movies") 22 23 // define pipeline stages 24 searchStage := bson.D{{"$search", bson.M{ 25 "index": "default", 26 "text": bson.D{ 27 {"path", "title"}, 28 {"query", "train"}, 29 }, 30 "sort": bson.D{{"title", 1}}, 31 }}} 32 limitStage := bson.D{{"$limit", 5}} 33 projectStage := bson.D{{"$project", bson.D{{"_id", 1}, {"title", 1}, {"awards", 1}, {"score", bson.D{{"$meta", "searchScore"}}}}}} 34 35 // run pipeline 36 cursor, err := collection.Aggregate(context.TODO(), mongo.Pipeline{searchStage, limitStage, projectStage}) 37 if err != nil { 38 panic(err) 39 } 40 41 // print results 42 var results []bson.D 43 if err = cursor.All(context.TODO(), &results); err != nil { 44 panic(err) 45 } 46 for _, result := range results { 47 fmt.Println(result) 48 } 49 }
[{_id ObjectID("573a139cf29313caabcf662c")} {title Atomic Train} {awards [{wins 1} {nominations 1} {text 1 win & 1 nomination.}]} {score 3.317898988723755}] [{_id ObjectId("64de50ae2932de4dd3203061")} {title atomic train} {awards [{wins 1} {nominations 1}]} {score 3.317898988723755}] [{_id ObjectID("573a13bbf29313caabd52ff4")} {title How to Train Your Dragon} {awards [{wins 32} {nominations 51} {text Nominated for 2 Oscars. Another 30 wins & 51 nominations.}]} {score 2.228306293487549}] [{_id ObjectId("64de50da2932de4dd3204393")} {title how to train your dragon} {awards [{wins 32} {nominations 51}]} {score 2.228306293487549}] [{_id ObjectID("573a13ccf29313caabd83281")} {title How to Train Your Dragon 2} {awards [{wins 18} {nominations 52} {text Nominated for 1 Oscar. Another 17 wins & 52 nominations.}]} {score 2.008449077606201}]
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
[{_id ObjectID("573a139cf29313caabcf662c")} {title Atomic Train} {awards [{wins 1} {nominations 1} {text 1 win & 1 nomination.}]} {score 3.3326687812805176}] [{_id ObjectID("573a13bbf29313caabd52ff4")} {title How to Train Your Dragon} {awards [{wins 32} {nominations 51} {text Nominated for 2 Oscars. Another 30 wins & 51 nominations.}]} {score 2.2382168769836426}] [{_id ObjectID("573a13ccf29313caabd83281")} {title How to Train Your Dragon 2} {awards [{wins 18} {nominations 52} {text Nominated for 1 Oscar. Another 17 wins & 52 nominations.}]} {score 2.0173802375793457}] [{_id ObjectID("573a13b1f29313caabd36490")} {title Howard Zinn: You Can't Be Neutral on a Moving Train} {awards [{wins 1} {nominations 0} {text 1 win.}]} {score 1.446497917175293}] [{_id ObjectID("573a13c8f29313caabd78a6b")} {title Last Train Home} {awards [{wins 14} {nominations 9} {text 14 wins & 9 nominations.}]} {score 2.8655927181243896}]
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
1 import java.util.Arrays; 2 import static com.mongodb.client.model.Aggregates.limit; 3 import static com.mongodb.client.model.Aggregates.project; 4 import static com.mongodb.client.model.Projections.*; 5 import com.mongodb.client.MongoClient; 6 import com.mongodb.client.MongoClients; 7 import com.mongodb.client.MongoCollection; 8 import com.mongodb.client.MongoDatabase; 9 import org.bson.Document; 10 11 public class CaseInsensitiveQuery { 12 public static void main( String[] args ) { 13 // define query 14 Document agg = 15 new Document("$search", 16 new Document("index", "default") 17 .append("text", 18 new Document("path", "title") 19 .append("query", "train")) 20 .append("sort", 21 new Document("title", 1))); 22 23 // specify connection 24 String uri = "<connection-string>"; 25 26 // establish connection and set namespace 27 try (MongoClient mongoClient = MongoClients.create(uri)) { 28 MongoDatabase database = mongoClient.getDatabase("sample_mflix"); 29 MongoCollection<Document> collection = database.getCollection("movies"); 30 31 // run query and print results 32 collection.aggregate(Arrays.asList(agg, 33 limit(5), 34 project(fields(include("_id"), include("title"), include("awards"), computed("score", new Document("$meta", "searchScore")))))) 35 .forEach(doc -> System.out.println(doc.toJson())); 36 } 37 } 38 }
{"_id": {"$oid": "573a139cf29313caabcf662c"}, "title": "Atomic Train", "awards": {"wins": 1, "nominations": 1, "text": "1 win & 1 nomination."}, "score": 3.317898988723755} {"_id": {"$oid": "64de50ae2932de4dd3203061"}, "title": "atomic train", "awards": {"wins": 1, "nominations": 1}, "score": 3.317898988723755} {"_id": {"$oid": "573a13bbf29313caabd52ff4"}, "title": "How to Train Your Dragon", "awards": {"wins": 32, "nominations": 51, "text": "Nominated for 2 Oscars. Another 30 wins & 51 nominations."}, "score": 2.228306293487549} {"_id": {"$oid": "64de50da2932de4dd3204393"}, "title": "how to train your dragon", "awards": {"wins": 32, "nominations": 51}, "score": 2.228306293487549} {"_id": {"$oid": "573a13ccf29313caabd83281"}, "title": "How to Train Your Dragon 2", "awards": {"wins": 18, "nominations": 52, "text": "Nominated for 1 Oscar. Another 17 wins & 52 nominations."}, "score": 2.008449077606201}
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
{"_id": {"$oid": "573a139cf29313caabcf662c"}, "title": "Atomic Train", "awards": {"wins": 1, "nominations": 1, "text": "1 win & 1 nomination."}, "score": 3.3326687812805176} {"_id": {"$oid": "573a13bbf29313caabd52ff4"}, "title": "How to Train Your Dragon", "awards": {"wins": 32, "nominations": 51, "text": "Nominated for 2 Oscars. Another 30 wins & 51 nominations."}, "score": 2.2382168769836426} {"_id": {"$oid": "573a13ccf29313caabd83281"}, "title": "How to Train Your Dragon 2", "awards": {"wins": 18, "nominations": 52, "text": "Nominated for 1 Oscar. Another 17 wins & 52 nominations."}, "score": 2.0173802375793457} {"_id": {"$oid": "573a13b1f29313caabd36490"}, "title": "Howard Zinn: You Can't Be Neutral on a Moving Train", "awards": {"wins": 1, "nominations": 0, "text": "1 win."}, "score": 1.446497917175293} {"_id": {"$oid": "573a13c8f29313caabd78a6b"}, "title": "Last Train Home", "awards": {"wins": 14, "nominations": 9, "text": "14 wins & 9 nominations."}, "score": 2.8655927181243896}
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
1 import com.mongodb.client.model.Aggregates.limit 2 import com.mongodb.client.model.Aggregates.project 3 import com.mongodb.client.model.Projections.* 4 import com.mongodb.kotlin.client.coroutine.MongoClient 5 import kotlinx.coroutines.runBlocking 6 import org.bson.Document 7 8 fun main() { 9 // establish connection and set namespace 10 val uri = "<connection-string>" 11 val mongoClient = MongoClient.create(uri) 12 val database = mongoClient.getDatabase("sample_mflix") 13 val collection = database.getCollection<Document>("movies") 14 15 runBlocking { 16 // define query 17 val agg = Document( 18 "\$search", 19 Document("index", "default") 20 .append( 21 "text", 22 Document("path", "title") 23 .append("query", "train") 24 ) 25 .append( 26 "sort", 27 Document("title", 1) 28 ) 29 ) 30 31 // run query and print results 32 val resultsFlow = collection.aggregate<Document>( 33 listOf( 34 agg, 35 limit(5), 36 project(fields( 37 excludeId(), 38 include("title", "awards"), 39 computed("score", Document("\$meta", "searchScore")) 40 )) 41 ) 42 ) 43 resultsFlow.collect { println(it) } 44 } 45 mongoClient.close() 46 }
Document{{title=atomic train, awards=Document{{wins=1, nominations=1}}, score=3.3326687812805176}} Document{{title=Atomic Train, awards=Document{{wins=1, nominations=1, text=1 win & 1 nomination.}}, score=3.3326687812805176}} Document{{title=how to train your dragon, awards=Document{{wins=32, nominations=51}}, score=2.2382168769836426}} Document{{title=How to Train Your Dragon, awards=Document{{wins=32, nominations=51, text=Nominated for 2 Oscars. Another 30 wins & 51 nominations.}}, score=2.2382168769836426}} Document{{title=How to Train Your Dragon 2, awards=Document{{wins=18, nominations=52, text=Nominated for 1 Oscar. Another 17 wins & 52 nominations.}}, score=2.0173802375793457}}
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
Document{{title=Atomic Train, awards=Document{{wins=1, nominations=1, text=1 win & 1 nomination.}}, score=3.3326687812805176}} Document{{title=How to Train Your Dragon, awards=Document{{wins=32, nominations=51, text=Nominated for 2 Oscars. Another 30 wins & 51 nominations.}}, score=2.2382168769836426}} Document{{title=How to Train Your Dragon 2, awards=Document{{wins=18, nominations=52, text=Nominated for 1 Oscar. Another 17 wins & 52 nominations.}}, score=2.0173802375793457}} Document{{title=Howard Zinn: You Can't Be Neutral on a Moving Train, awards=Document{{wins=1, nominations=0, text=1 win.}}, score=1.446497917175293}} Document{{title=Last Train Home, awards=Document{{wins=14, nominations=9, text=14 wins & 9 nominations.}}, score=2.8655927181243896}}
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
1 const { MongoClient } = require("mongodb"); 2 3 // Replace the uri string with your MongoDB deployments connection string. 4 const uri = 5 "<connection-string>"; 6 7 const client = new MongoClient(uri); 8 9 async function run() { 10 try { 11 await client.connect(); 12 13 // set namespace 14 const database = client.db("sample_mflix"); 15 const coll = database.collection("movies"); 16 17 // define pipeline 18 const agg = [ 19 { 20 '$search': { 21 'index': 'default', 22 'text': { 'path': 'title', 'query': 'train' }, 23 'sort': { 'title': 1 } 24 } 25 }, { 26 '$limit': 5 27 }, { 28 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' }} 29 } 30 ]; 31 32 // run pipeline 33 const result = await coll.aggregate(agg); 34 35 // print results 36 await result.forEach((doc) => console.log(doc)); 37 38 } finally { 39 await client.close(); 40 } 41 } 42 run().catch(console.dir);
{ _id: new ObjectId("573a139cf29313caabcf662c"), title: 'Atomic Train', awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' }, score: 3.317898988723755 } { _id: new ObjectId("64de50ae2932de4dd3203061"), title: 'atomic train', awards: { wins: 1, nominations: 1 }, score: 3.317898988723755 } { _id: new ObjectId("573a13bbf29313caabd52ff4"), title: 'How to Train Your Dragon', awards: { wins: 32, nominations: 51, text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.' }, score: 2.228306293487549 } { _id: new ObjectId("64de50da2932de4dd3204393"), title: 'how to train your dragon', awards: { wins: 32, nominations: 51 }, score: 2.228306293487549 } { _id: new ObjectId("573a13ccf29313caabd83281"), title: 'How to Train Your Dragon 2', awards: { wins: 18, nominations: 52, text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.' }, score: 2.008449077606201 }
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
{ _id: new ObjectId("573a139cf29313caabcf662c"), title: 'Atomic Train', awards: { wins: 1, nominations: 1, text: '1 win & 1 nomination.' }, score: 3.3326687812805176 } { _id: new ObjectId("573a13bbf29313caabd52ff4"), title: 'How to Train Your Dragon', awards: { wins: 32, nominations: 51, text: 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.' }, score: 2.2382168769836426 } { _id: new ObjectId("573a13ccf29313caabd83281"), title: 'How to Train Your Dragon 2', awards: { wins: 18, nominations: 52, text: 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.' }, score: 2.0173802375793457 } { _id: new ObjectId("573a13b1f29313caabd36490"), title: "Howard Zinn: You Can't Be Neutral on a Moving Train", awards: { wins: 1, nominations: 0, text: '1 win.' }, score: 1.446497917175293 } { _id: new ObjectId("573a13c8f29313caabd78a6b"), title: 'Last Train Home', awards: { wins: 14, nominations: 9, text: '14 wins & 9 nominations.' }, score: 2.8655927181243896 }
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
1 import pymongo 2 3 # connect to your Atlas cluster 4 client = pymongo.MongoClient('<connection-string>') 5 6 # define pipeline 7 pipeline = [ 8 { 9 '$search': { 10 'index': 'default', 11 'text': { 'path': 'title', 'query': 'train' }, 12 'sort': { 'title': 1 } 13 } 14 }, { 15 '$limit': 5 16 }, { 17 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' } } 18 } 19 ] 20 21 # run pipeline 22 result = client['sample_mflix']['movies'].aggregate(pipeline) 23 24 # print results 25 for i in result: 26 print(i)
{'_id': ObjectId('573a139cf29313caabcf662c'), 'title': 'Atomic Train', 'awards': {'wins': 1, 'nominations': 1, 'text': '1 win & 1 nomination.'}, 'score': 3.317898988723755} {'_id': ObjectId('64de50ae2932de4dd3203061'), 'title': 'atomic train', 'awards': {'wins': 1, 'nominations': 1}, 'score': 3.317898988723755} {'_id': ObjectId('573a13bbf29313caabd52ff4'), 'title': 'How to Train Your Dragon', 'awards': {'wins': 32, 'nominations': 51, 'text': 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'}, 'score': 2.228306293487549} {'_id': ObjectId('64de50da2932de4dd3204393'), 'title': 'how to train your dragon', 'awards': {'wins': 32, 'nominations': 51}, 'score': 2.228306293487549} {'_id': ObjectId('573a13ccf29313caabd83281'), 'title': 'How to Train Your Dragon 2', 'awards': {'wins': 18, 'nominations': 52, 'text': 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'}, 'score': 2.008449077606201}
Os resultados contêm documentos classificados independentemente de usar maiúsculas ou minúsculas. No entanto, se você definir normalizer
como none
, o MongoDB Search retornará os seguintes resultados:
{'_id': ObjectId('573a139cf29313caabcf662c'), 'title': 'Atomic Train', 'awards': {'wins': 1, 'nominations': 1, 'text': '1 win & 1 nomination.'}, 'score': 3.3326687812805176} {'_id': ObjectId('573a13bbf29313caabd52ff4'), 'title': 'How to Train Your Dragon', 'awards': {'wins': 32, 'nominations': 51, 'text': 'Nominated for 2 Oscars. Another 30 wins & 51 nominations.'}, 'score': 2.2382168769836426} {'_id': ObjectId('573a13ccf29313caabd83281'), 'title': 'How to Train Your Dragon 2', 'awards': {'wins': 18, 'nominations': 52, 'text': 'Nominated for 1 Oscar. Another 17 wins & 52 nominations.'}, 'score': 2.0173802375793457} {'_id': ObjectId('573a13b1f29313caabd36490'), 'title': "Howard Zinn: You Can't Be Neutral on a Moving Train", 'awards': {'wins': 1, 'nominations': 0, 'text': '1 win.'}, 'score': 1.446497917175293} {'_id': ObjectId('573a13c8f29313caabd78a6b'), 'title': 'Last Train Home', 'awards': {'wins': 14, 'nominations': 9, 'text': '14 wins & 9 nominations.'}, 'score': 2.8655927181243896}
Para classificar os resultados sem normalizar as maiúsculas e minúsculas, defina a opção normalizer
como none
(na linha 7) em sua definição de índice, salve a definição do índice e execute a query novamente.
Ordenar por ObjectId
A consulta a seguir usa o operador de intervalo para pesquisar o campo released
na coleção sample_mflix.movies
para filmes lançados entre 2015-01-01
e 2015-12-31
. Ele classifica os resultados pelo campo _id
, que contém o valor do tipo ObjectId
, em ordem decrescente.
db.movies.aggregate([ { "$search": { "range": { "path": "released", "gt": ISODate("2015-01-01T00:00:00.000Z"), "lt": ISODate("2015-12-31T00:00:00.000Z") }, "sort": { "_id": -1 } } }, { "$limit": 5 }, { "$project": { "_id": 1, "title": 1, "released": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: ObjectId('573a13fbf29313caabdedf31'), title: 'No Home Movie', released: ISODate('2015-08-10T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13fbf29313caabdedf30'), title: 'Our Loved Ones', released: ISODate('2015-08-12T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13faf29313caabded406'), title: 'The Red Spider', released: ISODate('2015-11-20T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13faf29313caabded1d6'), title: 'The Laundryman', released: ISODate('2015-07-11T00:00:00.000Z'), score: 1 }, { _id: ObjectId('573a13faf29313caabdecaf3'), title: 'Right Now, Wrong Then', released: ISODate('2015-09-01T00:00:00.000Z'), score: 1 } ]
Ordenar por UUID
A query a seguir pesquisa o termo hello
no campo b
na coleção users
. A query ordena os resultados pelo campo a
, que contém dados polimórficos (para demonstrar a ordem de classificação), em ordem crescente.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "a": 1 } } }, { "$project": { "_id": 1, "a": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 3, score: 0.029335692524909973 }, { _id: 0, a: UUID('1a324de2-e34b-c87e-f2a1-42ce37ad74ed'), score: 0.029335692524909973 }, { _id: 1, a: UUID('3b241101-e2bb-4255-8caf-4136c566a962'), score: 0.029335692524909973 }, { _id: 6, a: UUID('7eeddf21-b313-4a5c-81c2-c68915daa618'), score: 0.029335692524909973 }, { _id: 4, a: UUID('d3c12e1c-c36e-25ed-7c3e-1e7f1e53c752'), score: 0.029335692524909973 }, { _id: 5, a: UUID('d73f181e-cdda-42b4-b844-4d6e172e9bc8'), score: 0.029335692524909973 }, { _id: 2, a: UUID('dee11d4e-63c6-4d90-983c-5c9f1e79e96c'), score: 0.029335692524909973 } ]
Ordenar por valores nulos
Considere as seguintes queries que pesquisam b
o campo para a string hello
na users
collection usando o operador de texto. Em seguida, a query classifica os resultados por campo c
, que contém valores nulos ou ausentes para alguns documentos na collection.
Para saber mais, consulte Classificar por Valores Nulos e Omitidos.
Durante uma classificação ascendente, o MongoDB Search retorna documentos com valores nulos ou ausentes na parte superior dos resultados por padrão, conforme mostrado no exemplo a seguir:
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": 1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.029335692524909973 }, { _id: 5, c: [], score: 0.029335692524909973 }, { _id: 6, score: 0.029335692524909973 }, { _id: 2, c: 'foo', score: 0.029335692524909973 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.029335692524909973 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.029335692524909973 }, { _id: 1, c: true, score: 0.029335692524909973 } ]
Durante uma classificação decrescente, o MongoDB Search retorna documentos com valores nulos ou ausentes na parte inferior dos resultados por padrão, conforme mostrado no exemplo a seguir:
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": -1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
Observação
A configuração noData: lowest
é igual ao padrão.
Se você especificar o campo noData
como lowest
durante uma classificação ascendente, o MongoDB Search retornará documentos com valores nulos ou ausentes na parte superior dos resultados, conforme mostrado no exemplo a seguir.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": 1, "noData": "lowest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.029335692524909973 }, { _id: 5, c: [], score: 0.029335692524909973 }, { _id: 6, score: 0.029335692524909973 }, { _id: 2, c: 'foo', score: 0.029335692524909973 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.029335692524909973 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.029335692524909973 }, { _id: 1, c: true, score: 0.029335692524909973 } ]
Se você especificar o campo noData
como lowest
durante uma classificação decrescente, o MongoDB Search retornará documentos com valores nulos ou ausentes na parte inferior dos resultados, conforme mostrado no exemplo a seguir.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": -1, "noData": "lowest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
Se você especificar o campo noData
como highest
durante uma classificação ascendente, o MongoDB Search retornará documentos com valores nulos ou ausentes na parte inferior dos resultados, conforme mostrado no exemplo a seguir.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": 1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
Se você especificar o campo noData
como highest
durante uma classificação decrescente, o MongoDB Search retornará documentos com valores nulos ou ausentes na parte superior dos resultados, conforme mostrado no exemplo a seguir.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": -1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 } ]
A ordem dos documentos com "_id": 4
, "_id": 5
e "_id": 6
é aleatória porque o MongoDB Search trata os valores nulos e ausentes como iguais ao classificar.
Classificar em arrays de vários tipos
Considere as seguintes queries na collection de usuários dado um documento adicional com uma array de vários tipos no c
campo:
db.users.insertOne({ "_id": 7, "a": UUID("03e32aa9-1cbd-43b8-b9d6-18b171a03cc7"), "b": "hello", "c": [ false, null, 15 ] })
As queries a seguir pesquisam b
o campo para a string hello
usando o operador de texto e classificam os resultados por c
campo.
Observação
A noData: lowest
configuração em sua sintaxe de classificação é igual ao padrão.
Para uma classificação ascendente, o MongoDB Search usa o elemento com o menor tipo de BSON para representar a array de vários tipos. Por padrão, a MongoDB Search considera valores nulos ou ausentes como o valor JSON mais baixo. Portanto, o MongoDB Search usa null
para representar a array de vários tipos para o documento com _id: 7
e retorna esse documento na parte superior dos resultados, junto com outros valores nulos e ausentes.
Para saber mais, consulte Classificar por Valores Nulos e Omitidos e Classificar Matrizes com Vários Tipos.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": 1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 } ]
A ordem dos documentos com "_id": 4
, "_id": 5
, "_id": 6
e "_id": 7
é aleatória porque o MongoDB Search trata os valores nulos e ausentes como iguais ao classificar.
Para uma classificação decrescente, o MongoDB Search usa o elemento com o tipo de BSON mais alto para representar a array de vários tipos. O MongoDB Search usa false
para representar a array de vários tipos para o documento com _id: 7
, pois esse é o tipo de BSON mais alto da array. Como o MongoDB Search também classifica os valores true
acima dos valores false
, o MongoDB Search retorna este documento após o documento com _id: 1
.
Para saber mais, consulte Classificar por Valores Nulos e Omitidos e Classificar Matrizes com Vários Tipos.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": -1 } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 } { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 }, ]
A ordem dos documentos com "_id": 4
, "_id": 5
e "_id": 6
é aleatória porque o MongoDB Search trata os valores nulos e ausentes como iguais ao classificar.
As queries a seguir especificam noData: highest
para definir valores nulos como o tipo de BSON mais alto durante a classificação.
Para uma classificação ascendente, o MongoDB Search usa o elemento com o menor tipo de BSON para representar a array de vários tipos. A consulta especifica noData: highest
para considerar valores nulos ou ausentes como o valor de BSON mais alto, portanto, o MongoDB Search usa 15
para representar a array de vários tipos do documento com _id: 7
, pois os números são o próximo tipo de BSON mais baixo da array.
Para saber mais, consulte Classificar por Valores Nulos e Omitidos e Classificar Matrizes com Vários Tipos.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": 1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 } ]
A ordem dos documentos com "_id": 4
, "_id": 5
e "_id": 6
é aleatória porque o MongoDB Search trata os valores nulos e ausentes como iguais ao classificar.
Para uma classificação decrescente, o MongoDB Search usa o elemento com o tipo de BSON mais alto para representar a array de vários tipos. Como a consulta especifica o campo noData
como highest
para definir valores nulos ou ausentes como o valor BSON mais alto, o MongoDB Search usa null
para representar a array de vários tipos do documento com _id: 7
e retorna esse documento em a parte superior dos resultados junto com outros valores nulos e ausentes.
Para saber mais, consulte Classificar por Valores Nulos e Omitidos e Classificar Matrizes com Vários Tipos.
db.users.aggregate([ { "$search": { "text": { "path": "b", "query": "hello" }, "sort": { "c": { "order": -1, "noData": "highest" } } } }, { "$project": { "_id": 1, "c": 1, "score": { "$meta": "searchScore" } } } ])
[ { _id: 4, c: null, score: 0.025981096550822258 }, { _id: 5, c: [], score: 0.025981096550822258 }, { _id: 6, score: 0.025981096550822258 }, { _id: 7, c: [ false, null, 15 ], score: 0.025981096550822258 }, { _id: 1, c: true, score: 0.025981096550822258 }, { _id: 0, c: ObjectId('507f1f77bcf86cd799439011'), score: 0.025981096550822258 }, { _id: 3, c: UUID('3be11d4e-62cb-4e95-9a3c-5c9f1e56c732'), score: 0.025981096550822258 }, { _id: 2, c: 'foo', score: 0.025981096550822258 } ]
A ordem dos documentos com "_id": 4
, "_id": 5
, "_id": 6
e "_id": 7
é aleatória porque o MongoDB Search trata os valores nulos e ausentes como iguais ao classificar.
Ordenar por booleano
A query a seguir pesquisa a coleção de propriedades sample_airbnb.listingsAndReviews
em Portugal
e classifica os resultados em ordem decrescente pelo campo boolean
is_location_exact
.
A query usa o estágio $limit
para limitar a saída a 5
documentos. Ela também usa o estágio $project
para omitir todos os campos, exceto name
, property_type
, address.country
e address.location.is_location_exact
nos resultados.
1 db.listingsAndReviews.aggregate([ 2 { 3 "$search": { 4 "text": { 5 "path": "address.country", 6 "query": "Portugal" 7 }, 8 "sort": { 9 "address.location.is_location_exact": -1, 10 } 11 } 12 }, 13 { 14 "$limit": 5 15 }, 16 { 17 "$project": { 18 "_id": 0, 19 "name": 1, 20 "property_type": 1, 21 "address.country": 1, 22 "address.location.is_location_exact": 1 23 } 24 } 25 ])
1 [ 2 { 3 name: 'BBC OPORTO 4X2', 4 property_type: 'Apartment', 5 address: { country: 'Portugal', location: { is_location_exact: true } } 6 }, 7 { 8 name: 'Heroísmo IV', 9 property_type: 'Apartment', 10 address: { country: 'Portugal', location: { is_location_exact: true } } 11 }, 12 { 13 name: 'Spacious and well located apartment', 14 property_type: 'Apartment', 15 address: { country: 'Portugal', location: { is_location_exact: true } } 16 }, 17 { 18 name: 'Renovated Classic Design Studio with Sun Room', 19 property_type: 'Apartment', 20 address: { country: 'Portugal', location: { is_location_exact: true } } 21 }, 22 { 23 name: "O'Porto Studio | Historic Center", 24 property_type: 'Loft', 25 address: { country: 'Portugal', location: { is_location_exact: true } } 26 } 27 ]
Nos resultados anteriores, o valor de is_location_exact
é true
para os documentos porque, em uma classificação decrescente, o MongoDB Search classifica true
valores acima de false
valores. Se você fizer uma classificação ascendente alterando o valor na linha 9 da query anterior para 1
, o MongoDB Search classificará os documentos com valores false
maiores que true
valores e retornará os seguintes documentos:
[ { name: 'Ribeira Charming Duplex', property_type: 'House', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'Be Happy in Porto', property_type: 'Loft', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'Downtown Oporto Inn (room cleaning)', property_type: 'Hostel', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'A Casa Alegre é um apartamento T1.', property_type: 'Apartment', address: { country: 'Portugal', location: { is_location_exact: false } } }, { name: 'FloresRooms 3T', property_type: 'Apartment', address: { country: 'Portugal', location: { is_location_exact: false } } } ]
Pesquisa e classificação composta
A seguinte query utiliza o estágio $search
para fazer o seguinte:
Procure por filmes que tenham o termo
dance
no título, com preferência por filmes que ganharam 2 ou mais prêmios e foram lançados após 01 de janeiro de 1990.Classifique os resultados pelo número de prêmios em ordem decrescente, depois pelo título do filme em ordem crescente e, em seguida, pela data de lançamento em ordem decrescente.
A query usa o estágio $limit
para limitar a saída a 10
documentos. Ele também utiliza o estágio $project
para fazer o seguinte:
Omitir todos os campos exceto
title
,released
eawards.wins
nos resultados.Adicione um campo denominado
score
.
db.movies.aggregate([ { "$search": { "compound": { "must": [{ "text": { "path": "title", "query": "dance" } }], "should": [{ "range": { "path": "awards.wins", "gte": 2 } }, { "range": { "path": "released", "gte": ISODate("1990-01-01T00:00:00.000Z") } }] }, "sort": { "awards.wins": -1, "title": 1, "released": -1 } } }, { "$limit": 10 }, { "$project": { "_id": 0, "title": 1, "released": 1, "awards.wins": 1, "score": { "$meta": "searchScore" } } } ])
[ { title: 'Shall We Dance?', released: ISODate("1997-07-11T00:00:00.000Z"), awards: { wins: 57 }, score: 4.9811458587646484 }, { title: 'Shall We Dance?', released: ISODate("1997-07-11T00:00:00.000Z"), awards: { wins: 57 }, score: 4.9811458587646484 }, { title: 'War Dance', released: ISODate("2008-11-01T00:00:00.000Z"), awards: { wins: 11 }, score: 5.466421127319336 }, { title: 'Dance with the Devil', released: ISODate("1997-10-31T00:00:00.000Z"), awards: { wins: 6 }, score: 4.615056037902832 }, { title: 'Save the Last Dance', released: ISODate("2001-01-12T00:00:00.000Z"), awards: { wins: 6 }, score: 4.615056037902832 }, { title: 'Dance with a Stranger', released: ISODate("1985-08-09T00:00:00.000Z"), awards: { wins: 4 }, score: 3.615056037902832 }, { title: 'The Baby Dance', released: ISODate("1998-08-23T00:00:00.000Z"), awards: { wins: 4 }, score: 4.981145858764648 }, { title: 'Three-Step Dance', released: ISODate("2004-02-19T00:00:00.000Z"), awards: { wins: 4 }, score: 4.981145858764648 }, { title: "Cats Don't Dance", released: ISODate("1997-03-26T00:00:00.000Z"), awards: { wins: 3 }, score: 4.981145858764648 }, { title: 'Dance Me Outside', released: ISODate("1995-03-10T00:00:00.000Z"), awards: { wins: 3 }, score: 4.981145858764648 } ]
Pesquisa e classificação de facets
A seguinte query utiliza o estágio $search
para fazer o seguinte:
Pesquise filmes lançados entre 01 de janeiro de 2010 e 01 de janeiro de 2015 usando o operador de intervalo .
Conte o número de filmes que ganharam os prêmios
1
,5
,10
e15
.Obtenha uma contagem do número de filmes lançados em
2010-01-01
,2011-01-01
,2012-01-01
,2013-01-01
,2014-01-01
e2015-01-01
.Classifique os resultados em ordem decrescente da data de lançamento usando a opção
sort
.
A query utiliza o estágio $limit
para fazer o seguinte:
Limite a saída para
5
documentos no campodocs
saída.Limite a saída ao documento
1
no campo de saídameta
.
Ele utiliza o estágio $project
para omitir todos os campos, exceto os campos awards.wins
, released
e title
.
Ele também usa o estágio $replaceWith
para incluir os resultados de metadados armazenados na variável $$SEARCH_META
no campo de saída meta
e o estágio $set
para adicionar o campo meta
aos resultados.
db.movies.aggregate([ { "$search": { "facet": { "operator": { "range": { "path": "released", "gt": ISODate("2010-01-01T00:00:00.000Z"), "lt": ISODate("2015-01-01T00:00:00.000Z") } }, "facets": { "awardsFacet": { "type": "number", "path": "awards.wins", "boundaries" : [1,5,10,15] }, "releasedFacet" : { "type" : "date", "path" : "released", "boundaries" : [ISODate("2010-01-01T00:00:00.000Z"), ISODate("2011-01-01T00:00:00.000Z"), ISODate("2012-01-01T00:00:00.000Z"), ISODate("2013-01-01T00:00:00.000Z"), ISODate("2014-01-01T00:00:00.000Z"), ISODate("2015-01-01T00:00:00.000Z")] } } }, "sort": { "released": -1 } } }, { "$facet": { "docs": [ { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "released": 1, "awards.wins": 1 } } ], "meta": [ {"$replaceWith": "$$SEARCH_META"}, {"$limit": 1} ] } }, { "$set": { "meta": { "$arrayElemAt": ["$meta", 0] } } } ])
[ { docs: [ { title: 'Cold in July', released: ISODate("2014-12-31T00:00:00.000Z"), awards: { wins: 1 } }, { title: 'The Gambler', released: ISODate("2014-12-31T00:00:00.000Z"), awards: { wins: 7 } }, { title: 'Force Majeure', released: ISODate("2014-12-30T00:00:00.000Z"), awards: { wins: 31 } }, { title: 'LFO', released: ISODate("2014-12-27T00:00:00.000Z"), awards: { wins: 3 } }, { title: 'Peace After Marriage', released: ISODate('2014-12-26T00:00:00.000Z'), awards: { wins: 5 } } ], meta: { count: { lowerBound: Long("4821") }, facet: { releasedFacet: { buckets: [ { _id: ISODate("2010-01-01T00:00:00.000Z"), count: Long("857") }, { _id: ISODate("2011-01-01T00:00:00.000Z"), count: Long("909") }, { _id: ISODate("2012-01-01T00:00:00.000Z"), count: Long("903") }, { _id: ISODate("2013-01-01T00:00:00.000Z"), count: Long("1063") }, { _id: ISODate("2014-01-01T00:00:00.000Z"), count: Long("1089") } ] }, awardsFacet: { buckets: [ { _id: 1, count: Long("2330") }, { _id: 5, count: Long("604") }, { _id: 10, count: Long("233") } ] } } } } } ]
Classificar por pontuação
Os exemplos a seguir demonstram como classificar os resultados pela pontuação dos documentos nos resultados. Os exemplos demonstram como executar as seguintes ações:
Recupere os documentos de pontuação mais baixa primeiro classificando os resultados em ordem crescente.
Classifique os resultados por pontuação em ordem decrescente e, para resultados com pontuações idênticas, classifique arbitrariamente.
Classifique os resultados por pontuação e para resultados com pontuações idênticas, classifique utilizando um campo exclusivo.
A seguinte consulta utiliza o estágio $search
para executar as seguintes ações:
Procure filmes que tenham o termo
story
no título.Classifique os resultados por pontuação em ordem crescente.
A query usa o estágio $limit
para limitar a saída a 5
documentos. Ele também usa o estágio $project
para executar as seguintes ações:
Omitir todos os campos exceto
title
nos resultados.Adicione um campo denominado
score
.
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "story" }, "sort": {score: {$meta: "searchScore", order: 1}} } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "score": {$meta: "searchScore"} } } ])
[ { title: 'Do You Believe in Miracles? The Story of the 1980 U.S. Hockey Team', score: 0.8674521446228027 }, { title: 'Once in a Lifetime: The Extraordinary Story of the New York Cosmos', score: 0.9212141036987305 }, { title: 'The Source: The Story of the Beats and the Beat Generation', score: 0.9820802211761475 }, { title: 'If These Knishes Could Talk: The Story of the NY Accent', score: 0.9820802211761475 }, { title: 'Dream Deceivers: The Story Behind James Vance vs. Judas Priest', score: 1.051558256149292 } ]
A seguinte consulta utiliza o estágio $search
para executar as seguintes ações:
Procure filmes que tenham o termo
summer
no título.Classifique os resultados por pontuação em ordem decrescente e, para resultados com pontuações idênticas, classifique arbitrariamente.
A query usa o estágio $limit
para limitar a saída a 5
documentos. Ele também usa o estágio $project
para executar as seguintes ações:
Omitir todos os campos, exceto
_id
etitle
nos resultados.Adicione um campo denominado
score
.
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "summer" }, "sort": {score: {$meta: "searchScore"}} } }, { "$limit": 5 }, { "$project": { "_id": 1, "title": 1, "score": {$meta: "searchScore"} } } ])
[ { _id: ObjectId("573a1398f29313caabcea21e"), title: 'Summer', score: 3.5844719409942627 }, { _id: ObjectId("573a13a6f29313caabd18eca"), title: 'Summer Things', score: 3.000213623046875 }, { _id: ObjectId("573a13b8f29313caabd4c1d0"), title: 'Summer Palace', score: 3.000213623046875 }, { _id: ObjectId("573a1394f29313caabcde8e8"), title: 'Summer Stock', score: 3.000213623046875 }, { _id: ObjectId("573a13acf29313caabd284fa"), title: 'Wolf Summer', score: 3.000213623046875 } ]
A seguinte consulta utiliza o estágio $search
para executar as seguintes ações:
Procure filmes que tenham o termo
prince
no título.Classifique os resultados primeiro por pontuação e, em seguida, pelo valor do campo
released
em ordem crescente para resultados com pontuações idênticas.
A query usa o estágio $limit
para limitar a saída a 5
documentos. Ele também usa o estágio $project
para executar as seguintes ações:
Omitir todos os campos, exceto
title
ereleased
nos resultados.Adicione um campo denominado
score
.
db.movies.aggregate([ { "$search": { "text": { "path": "title", "query": "prince" }, "sort": {score: {$meta: "searchScore"}, "released": 1} } }, { "$limit": 5 }, { "$project": { "_id": 0, "title": 1, "released": 1, "score": {$meta: "searchScore"} } } ])
[ { title: 'Prince', released: ISODate("2015-08-14T00:00:00.000Z"), score: 4.168826103210449 }, { title: 'Prince Avalanche', released: ISODate("2013-09-19T00:00:00.000Z"), score: 3.4893198013305664 }, { title: 'The Prince', released: ISODate("2014-08-22T00:00:00.000Z"), score: 3.4893198013305664 }, { title: 'Prince of Foxes', released: ISODate("1949-12-23T00:00:00.000Z"), score: 3.0002830028533936 }, { title: 'The Oil Prince', released: ISODate("1966-01-01T00:00:00.000Z"), score: 3.0002830028533936 } ]