How to Sort Your Atlas Search Results
On this page
This tutorial describes how to sort the Atlas Search results
by numeric, date, and string fields in the sample_mflix.movies
collection in ascending or descending order. It also demonstrates how to
perform a case-insensitive sort of your Atlas Search results.
When you create an Atlas Search index on a collection, you can configure the
index to normalize the value of a string field to lowercase. This allows
you to sort your query results regardless of the sorted field's letter
case.
To demonstrate how to sort Atlas Search results by numeric, date, and
string fields using the default behavior of Atlas Search sort
option,
the tutorial takes you through the following steps:
Create an Atlas Search index on the string field named
title
, date field namedreleased
, and numeric field namedawards.wins
in thesample_mflix.movies
collection for both running queries against these fields and sorting the results by these fields.Note
If you enable dynamic mappings, Atlas Search automatically indexes number and date types for sorting. It doesn't dynamically index string fields for sorting. Instead, you must use the token type to index string fields for sorting.
Run Atlas Search queries against the
title
,released
, andawards.wins
fields in thesample_mflix.movies
collection and sort the results in ascending and descending order by these fields.
To demonstrate how to sort Atlas Search results by normalizing the value
of a string field to lowercase using Atlas Search sort
option, the
tutorial takes you through the following steps:
Load sample documents into the
sample_mflix.movies
collection on your Atlas cluster.Create Atlas Search indexes on the string field named
title
for both running queries and sorting the results by this field.Note
If you enable dynamic mappings, Atlas Search automatically indexes number and date types for sorting. It doesn't dynamically index string fields for sorting. Instead, you must use the token type to index string fields for sorting.
Run Atlas Search queries against the
title
field in the collection and sort the results by the indexed fields.
Before you begin, ensure that your Atlas cluster meets the requirements described in the Prerequisites.
To create an Atlas Search index, you must have Project Data Access Admin
or higher access to the project.
Load the Sample Data
To sort documents in the sample_mflix.movies
collection by
number, date, and string fields using the default sort
behavior, you can skip this section and proceed to create the
index for the collection.
Overview
To demonstrate how Atlas Search sorts documents regardless of the letter
case, we provide sample documents. Each sample document represents
a movie and contains three fields that specifies the movie's title
(in lowercase), genre, and number of awards. In this section, you
load the sample documents to the sample_mflix.movies
collection in your Atlas cluster. You can load the sample
collection using the Atlas UI or mongosh
.
Procedure
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Load the collection to a database in your Atlas cluster.
You can load the collection from your Atlas UI or mongosh
:
Expand the
sample_mflix
database and select themovies
collection.For each of the sample document to add to the collection, do the following:
Click Insert Document and select the JSON view ({}) to replace the default document.
One at a time, copy and paste the following sample documents and click Insert to add each document to the collection.
1 { 2 "genres": [ "Action", "Drama", "Thriller" ], 3 "title": "atomic train", 4 "awards": { "wins": 1, "nominations": 1 } 5 } 1 { 2 "genres": [ "Animation", "Adventure", "Family" ], 3 "title": "how to train your dragon", 4 "awards": { "wins": 32, "nominations": 51 } 5 }
Click Connect for the cluster to which you want to connect.
Select Shell and complete the steps to connect to your cluster through
mongosh
.To learn more, see Connect via
mongosh
.Switch to the
sample_mflix
database inmongosh
.use sample_mflix switched to db sample_mflix Run the following command in
mongosh
to load the collection to the selected database:1 db.movies.insertMany([ 2 { 3 "_id": 1, 4 "genres": [ "Action", "Drama", "Thriller" ], 5 "title": "atomic train", 6 "awards": { wins: 1, nominations: 1 } 7 }, 8 { 9 "_id": 2, 10 "genres": [ "Animation", "Adventure", "Family" ], 11 "title": "how to train your dragon", 12 "awards": { "wins": 32, "nominations": 51 }, 13 } 14 ]) { acknowledged: true, insertedIds: { '0': 1, '1': 2 } }
Create the Atlas Search Index
Overview
In this section, you will create an Atlas Search index on the title
,
released
, and awards.wins
fields in the sample_mflix.movies
collection for running queries against these fields and sorting the
results by these fields.
In this section, you will create an Atlas Search index on the title
field in the sample_mflix.movies
collection for running
queries against this field and sorting the results by this field.
Procedure
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Go to the Atlas Search page for your cluster.
You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.
In the sidebar, click Atlas Search under the Services heading.
From the Select data source dropdown, select your cluster and click Go to Atlas Search.
Click the Browse Collections button for your cluster.
Expand the database and select the collection.
Click the Search Indexes tab for the collection.
Click the cluster's name.
Click the Atlas Search tab.
Enter the Index Name, and set the Database and Collection.
In the Index Name field, enter
sort-tutorial
.Note
If you name your index
default
, you don't need to specify anindex
parameter when using the $search pipeline stage. Otherwise, you must specify the index name using theindex
parameter.In the Database and Collection section, find the
sample_mflix
database, and select themovies
collection.
Specify an index definition.
The following index definition:
Indexes the
awards.wins
field as the number type for both querying and sorting the results by the field.Indexes the
released
field as the date type for both querying and sorting the results by the field.Specifies the keyword analyzer for both indexing and searching the
title
field, and indexes thetitle
field as the following types:You can use the Atlas Search Visual Editor or the Atlas Search JSON Editor in the Atlas UI to create the index.
Click Next.
Click Refine Your Index.
In the Index Configurations section, toggle to disable Dynamic Mapping.
In the Field Mappings section, click Add Field to display the Add Field Mapping window.
For the following fields, one at a time, select the field name and data type from the corresponding dropdowns, configure the properties if any or accept default, and click Add.
Field NameData TypePropertiesawards.wins
NumberAccept default.released
DateAccept default.title
TokenAccept default.title
StringSelectlucene.keyword
from both the Index Analyzer and Search Analyzer dropdowns.
Replace the default index definition with the following definition.
{ "mappings": { "dynamic": false, "fields": { "awards": { "dynamic": false, "fields": { "wins": [ { "type": "number" } ] }, "type": "document" }, "released": [ { "type": "date" } ], "title": [{ "type": "token" }, { "type": "string", "analyzer": "lucene.keyword", "searchAnalyzer": "lucene.keyword" }] } } } Click Next.
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Enter the Index Name, and set the Database and Collection.
In the Index Name field, enter
case-insensitive-sort
.Note
If you name your index
default
, you don't need to specify anindex
parameter when using the $search pipeline stage. Otherwise, you must specify the index name using theindex
parameter.In the Database and Collection section, find the
sample_mflix
database, and select themovies
collection.
Define the Atlas Search index.
The following index definition indexes the title
field as the
following types:
token type for sorting, which uses the
lowercase
normalizer to convert the indexed term to lowercase.string type for querying the field.
You can use the Atlas Search Visual Editor or the Atlas Search JSON Editor in the Atlas user interface to create the index.
Click Next.
Click Refine Your Index.
In the Index Configurations section, toggle to disable Dynamic Mapping.
In the Field Mappings section, click Add Field to display the Add Field Mapping window.
Select
title
from the Field Name dropdown.Select Token from the Data Type dropdown.
Expand Token Properties and select
lowercase
from the Normalizer dropdown.Click Add.
Repeat steps d and e.
Select String from the Data Type dropdown.
Click Add.
Replace the default index definition with the following definition.
1 { 2 "mappings": { 3 "dynamic": false, 4 "fields": { 5 "title": [{ 6 "type": "token", 7 "normalizer": "lowercase" 8 },{ 9 "type": "string" 10 }] 11 } 12 } 13 } Click Next.
Sort Your Search Results
➤ Use the Select your language drop-down menu to set the language of the example in this section.
You can sort your search results in multiple ways. In this section, you
connect to your Atlas cluster and then run the sample queries
against the indexed fields in the sample_mflix.movies
collection.
Sort Numbers
The $search
stage in the sample queries use the
sort
option to sort the Atlas Search results by the indexed number
field.
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Go to the Atlas Search page for your cluster.
You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.
In the sidebar, click Atlas Search under the Services heading.
From the Select data source dropdown, select your cluster and click Go to Atlas Search.
Click the Browse Collections button for your cluster.
Expand the database and select the collection.
Click the Search Indexes tab for the collection.
Click the cluster's name.
Click the Atlas Search tab.
Run an Atlas Search query against the indexed field and sort the results.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
Copy and paste the following query into the Query Editor, and then click the Search button in the Query Editor.
[ { "$search": { "index": "sort-tutorial", "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 ... ...
Expand your query results.
The Search Tester might not display all the fields in the documents it returns. To view all the fields, including the field that you specify in the query path, expand the document in the results.
Connect to your cluster in mongosh
.
Open mongosh
in a terminal window and
connect to your cluster. For detailed instructions on connecting,
see Connect via mongosh
.
Use the sample_mflix
database.
Run the following command at mongosh
prompt:
use sample_mflix
Run an Atlas Search query against the indexed field and sort the results.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
$search
stage to search theawards.wins
field and sort the results in descending order.$limit
stage to limit the output to5
results.$project
stage to exclude all fields excepttitle
andawards.wins
.
1 db.movies.aggregate([ 2 { 3 "$search": { 4 "index": "sort-tutorial", 5 "range": { 6 "path": "awards.wins", 7 "gte": 10 8 }, 9 "sort": { 10 "awards.wins": -1, 11 } 12 } 13 }, 14 { 15 $limit: 5 16 }, 17 { 18 "$project": { 19 "_id": 0, 20 "title": 1, 21 "awards.wins": 1 22 } 23 } 24 ])
[ { 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 } } ]
Connect to your cluster in MongoDB Compass.
Open MongoDB Compass and connect to your cluster. For detailed instructions on connecting, see Connect via Compass.
Run an Atlas Search query against the indexed field and sort the results.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
$search
stage to search theawards.wins
field and sort the results in descending order.$limit
stage to limit the output to5
results.$project
stage to exclude all fields excepttitle
andawards.wins
.
To run this query in MongoDB Compass:
Click the Aggregations tab.
Click Select..., then configure each of the following pipeline stages by selecting the stage from the dropdown and adding the query for that stage. Click Add Stage to add additional stages.
Pipeline StageQuery$search
{ index: "sort-tutorial", "range": { "path": "awards.wins", "gte": 10 }, "sort": { "awards.wins": -1, } } $limit
5 $project
{ title: 1, released: 1, year: 1 } If you enabled Auto Preview, MongoDB Compass displays the following documents next to the
$limit
pipeline stage:[ { 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 } } ]
Set up and initialize the .NET/C# project for the query.
Create a new directory called
sort-by-numbers-example
and initialize your project with thedotnet new
command.mkdir sort-by-numbers-example cd sort-by-numbers-example dotnet new console Add the .NET/C# Driver to your project as a dependency.
dotnet add package MongoDB.Driver
Create the query in the Program.cs
file.
Replace the contents of the
Program.cs
file with the following code.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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 = "sort-tutorial" 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 } Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Compile and run the Program.cs
file.
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 } }
Copy and paste the following code into the sort-by-numbers.go
file.
The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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.D{ 25 {"index", "sort-tutorial"}, 26 {"range", bson.D{ 27 {"path", "awards.wins"}, 28 {"gte", 10}, 29 }}, 30 {"sort", bson.D{{"awards.wins", -1}}}, 31 }}} 32 limitStage := bson.D{{"$limit", 5}} 33 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"awards.wins", 1}, {"_id", 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 }
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
go run sort-by-numbers.go
[{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}]}]
Run an Atlas Search query against the indexed field and sort the results.
Create a file named
SortByNumbers.java
.Copy and paste the following code into the
SortByNumbers.java
file.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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", "sort-tutorial") 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 } Note
To run the sample code in your Maven environment, add the following code above the import statements in your file.
package com.mongodb.drivers; Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.Compile and run the
SortByNumbers.java
file.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}}
Run an Atlas Search query against the indexed field and sort the results.
Create a file named
SortByNumbers.kt
.Copy and paste the following code into the
SortByNumbers.kt
file.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
Prints the documents that match the query from the
AggregateFlow
instance.
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", "sort-tutorial") 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 } Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.Run the
SortByNumbers.kt
file.When you run the
SortByNumbers.kt
program in your IDE, it prints the following documents: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}}}}
Copy and paste the following code into the sort-by-numbers.js
file.
The code example performs the following tasks:
Imports
mongodb
, MongoDB's Node.js driver.Creates an instance of the
MongoClient
class to establish a connection to your Atlas cluster.The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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': 'sort-tutorial', 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);
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
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 } }
Copy and paste the following code into the sort-by-numbers.py
file.
The following code example:
Imports
pymongo
, MongoDB's Python driver, and thedns
module, which is required to connectpymongo
toAtlas
using a DNS seed list connection string.Creates an instance of the
MongoClient
class to establish a connection to your Atlas cluster.The following query shows how to sort the results by a numeric field. It uses the range operator to search for movies that have won 10 or more awards and then sorts the results by the numeric field value in descending order.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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 { 10 '$search': { 11 'index': 'sort-tutorial', 12 'range': { 13 'path': 'awards.wins', 14 'gte': 10 15 }, 16 'sort': { 17 'awards.wins': -1 18 } 19 } 20 }, { 21 '$limit': 5 22 }, { 23 '$project': {'_id': 0, 'title': 1, 'awards.wins': 1 24 } 25 } 26 ] 27 28 # run pipeline 29 result = client['sample_mflix']['movies'].aggregate(pipeline) 30 31 # print results 32 for i in result: 33 print(i)
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
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}}
Sort Dates
The $search
stage in the sample queries use the
sort
option to sort the Atlas Search results by the indexed date
field.
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Go to the Atlas Search page for your cluster.
You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.
In the sidebar, click Atlas Search under the Services heading.
From the Select data source dropdown, select your cluster and click Go to Atlas Search.
Click the Browse Collections button for your cluster.
Expand the database and select the collection.
Click the Search Indexes tab for the collection.
Click the cluster's name.
Click the Atlas Search tab.
Run an Atlas Search query against the indexed date field and sort the results.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
Copy and paste the following query into the Query Editor, and then click the Search button in the Query Editor.
[ { $search: { "index": "sort-tutorial", "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 ...
Expand your query results.
The Search Tester might not display all the fields in the documents it returns. To view all the fields, including the field that you specify in the query path, expand the document in the results.
Connect to your cluster in mongosh
.
Open mongosh
in a terminal window and
connect to your cluster. For detailed instructions on connecting,
see Connect via mongosh
.
Use the sample_mflix
database.
Run the following command at mongosh
prompt:
use sample_mflix
Run an Atlas Search query against the indexed date field and sort the results.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
$search
stage to search thetitle
andreleased
fields and then sort the results by thereleased
field in descending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
andreleased
.Add a field named
score
.
1 db.movies.aggregate([ 2 { 3 $search: { 4 "index": "sort-tutorial", 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 } ]
Connect to your cluster in MongoDB Compass.
Open MongoDB Compass and connect to your cluster. For detailed instructions on connecting, see Connect via Compass.
Run an Atlas Search query against the indexed field and sort the results very fast.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
$search
stage to search thetitle
andreleased
fields and then sort the results by thereleased
field in descending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
andreleased
.Add a field named
score
.
To run this query in MongoDB Compass:
Click the Aggregations tab.
Click Select..., then configure each of the following pipeline stages by selecting the stage from the dropdown and adding the query for that stage. Click Add Stage to add additional stages.
Pipeline StageQuery$search
{ "index": "sort-tutorial", "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 } } $limit
5 $project
{ _id: 0, title: 1, released: 1, score: { $meta: "searchScore" } } If you enabled Auto Preview, MongoDB Compass displays the following documents next to the
$limit
pipeline stage:{ 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 }
Set up and initialize the .NET/C# project for the query.
Create a new directory called
sort-by-date-example
and initialize your project with thedotnet new
command.mkdir sort-by-date-example cd sort-by-date-example dotnet new console Add the .NET/C# Driver to your project as a dependency.
dotnet add package MongoDB.Driver
Create the query in the Program.cs
file.
Replace the contents of the
Program.cs
file with the following code.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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 = "sort-tutorial" 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 } Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Compile and run the Program.cs
file.
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 }
Copy and paste the following code into the sort-by-date.go
file.
The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "time" 7 8 "go.mongodb.org/mongo-driver/bson" 9 "go.mongodb.org/mongo-driver/mongo" 10 "go.mongodb.org/mongo-driver/mongo/options" 11 ) 12 13 func main() { 14 // connect to your Atlas cluster 15 client, err := mongo.Connect(context.TODO(), 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{{"$search", bson.M{ 26 "index": "sort-tutorial", 27 "compound": bson.M{ 28 "filter": bson.A{ 29 bson.M{ 30 "wildcard": bson.D{ 31 {"path", "title"}, 32 {"query", "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{{"released", -1}}, 44 }}} 45 46 limitStage := bson.D{{"$limit", 5}} 47 projectStage := bson.D{{"$project", bson.D{{"_id", 0}, {"title", 1}, {"released", 1}, {"score", bson.D{{"$meta", "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 }
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
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}]
Run an Atlas Search query against the indexed field and sort the results.
Create a file named
SortByDate.java
.Copy and paste the following code into the
SortByDate.java
file.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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", "sort-tutorial") 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 } Note
To run the sample code in your Maven environment, add the following code above the import statements in your file.
package com.mongodb.drivers; Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.Compile and run the
SortDateForSpeed.java
file.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}
Run an Atlas Search query against the indexed field and sort the results.
Create a file named
SortByDate.kt
.Copy and paste the following code into the
SortByDate.kt
file.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
Prints the documents that match the query from the
AggregateFlow
instance.
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", "sort-tutorial") 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 } Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.Run the
SortByDate.kt
file.When you run the
SortByDate.kt
program in your IDE, it prints the following documents: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}}
Copy and paste the following code into the sort-by-date.js
file.
The code example performs the following tasks:
Imports
mongodb
, MongoDB's Node.js driver.Creates an instance of the
MongoClient
class to establish a connection to your Atlas cluster.The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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: "sort-tutorial", 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);
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
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 }
Copy and paste the following code into the sort-by-date.py
file.
The following code example:
Imports
pymongo
, MongoDB's Python driver, and thedns
module, which is required to connectpymongo
toAtlas
using a DNS seed list connection string.Creates an instance of the
MongoClient
class to establish a connection to your Atlas cluster.The following query shows how to run a compound query and sort the results by a date field. It uses the following operators:
wildcard operator to search for movie titles that begin with
Summer
.near operator to search for movies that were released in and about five months before or after April 18, 2014.
Note
When you use
pivot
on a date field, its unit of measure is in milliseconds. Atlas Search calculates a score for each document based on how close the date field is to the specified date. To learn more, see near.
The query uses the following pipeline stages:
Iterates over the cursor to print the documents that match the query.
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': 'sort-tutorial', 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)
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
python sort-date-for-speed.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}
Sort Strings
The $search
stage in the sample queries use the
sort
option to sort the Atlas Search results by the indexed string
field.
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Go to the Atlas Search page for your cluster.
You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.
In the sidebar, click Atlas Search under the Services heading.
From the Select data source dropdown, select your cluster and click Go to Atlas Search.
Click the Browse Collections button for your cluster.
Expand the database and select the collection.
Click the Search Indexes tab for the collection.
Click the cluster's name.
Click the Atlas Search tab.
Run an Atlas Search query against the indexed string field and sort the results.
The following query shows how to query and sort the results by a
string field. It searches for titles that begin with Prance
or
Prince
and sorts the results by the title
field in ascending
order.
Copy and paste the following query into the Query Editor, and then click the Search button in the Query Editor.
[ { $search: { "index": "sort-tutorial", "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" ...
The Atlas Search results contain documents with movie titles that begin with
Prance
and Prince
. Atlas Search returns titles with Prance
followed by Prince
because Atlas Search sorts documents by the title
field in ascending order.
Expand your query results.
The Search Tester might not display all the fields in the documents it returns. To view all the fields, including the field that you specify in the query path, expand the document in the results.
Connect to your cluster in mongosh
.
Open mongosh
in a terminal window and
connect to your cluster. For detailed instructions on connecting,
see Connect via mongosh
.
Use the sample_mflix
database.
Run the following command at mongosh
prompt:
use sample_mflix
Run an Atlas Search query against the indexed string and date fields and sort by the string field in ascending order.
The following query shows how to query and sort the results by a
string field. It searches for titles that begin with Prance
or
Prince
and sorts the results by the title
field in ascending
order.
The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
1 db.movies.aggregate([{ 2 $search: { 3 "index": "sort-tutorial", 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 } ]
The Atlas Search results contain documents with movie titles that begin with
Prance
and Prince
. Atlas Search returns titles with Prance
followed by Prince
because Atlas Search sorts documents by the title
field in ascending order.
Connect to your cluster in MongoDB Compass.
Open MongoDB Compass and connect to your cluster. For detailed instructions on connecting, see Connect via Compass.
Run an Atlas Search query against the indexed field and sort the results.
The following query shows how to query and sort the results by a
string field. It searches for titles that begin with Prance
or
Prince
and sorts the results by the title
field in ascending
order.
The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
To run this query in MongoDB Compass:
Click the Aggregations tab.
Click Select..., then configure each of the following pipeline stages by selecting the stage from the dropdown and adding the query for that stage. Click Add Stage to add additional stages.
Pipeline StageQuery$search
{ index: "sort-tutorial", compound: { should: [{ wildcard: { query: "Prance*", path: 'title', allowAnalyzedField: true }}, { wildcard: { query: "Prince*", path: 'title', allowAnalyzedField: true } }] }, sort: { title: 1 } } $limit
5 $project
{ _id: 0, title: 1, score: { $meta: "searchScore" } } If you enabled Auto Preview, MongoDB Compass displays the following documents next to the
$project
pipeline stage:{ title: 'Prancer', score: 1 }, { title: 'Prancer Returns', score: 1 }, { title: 'Prince', score: 1 }, { title: 'Prince Avalanche', score: 1 }, { title: 'Prince of Boradway', score: 1 } The Atlas Search results contain documents with movie titles that begin with
Prance
andPrince
. Atlas Search returns titles withPrance
followed byPrince
because Atlas Search sorts documents by thetitle
field in ascending order.
Set up and initialize the .NET/C# project for the query.
Create a new directory called
sort-by-strings-example
and initialize your project with thedotnet new
command.mkdir sort-by-strings-example cd sort-by-strings-example dotnet new console Add the .NET/C# Driver to your project as a dependency.
dotnet add package MongoDB.Driver
Create the query in the Program.cs
file.
Replace the contents of the
Program.cs
file with the following code.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to query and sort the results by a string field. It searches for titles that begin with
Prance
orPrince
and sorts the results by thetitle
field in ascending order.The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
Iterates over the cursor to print the documents that match the query.
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 = "sort-tutorial" 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 } Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Compile and run the Program.cs
file.
dotnet run Program.cs
{ "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 }
The Atlas Search results contain documents with movie titles that begin with
Prance
and Prince
. Atlas Search returns titles with Prance
followed by Prince
because Atlas Search sorts documents by the title
field in ascending order.
Copy and paste the following code into the sort-by-strings.go
file.
The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to query and sort the results by a string field. It searches for titles that begin with
Prance
orPrince
and sorts the results by thetitle
field in ascending order.The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
Iterates over the cursor to print the documents that match the query.
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": "sort-tutorial", 26 "compound": bson.M{ 27 "should": bson.A{ 28 bson.M{ 29 "wildcard": bson.D{ 30 {"path", "title"}, 31 {"query", "Prance*"}, 32 {"allowAnalyzedField", true}, 33 }}, 34 bson.M{ 35 "wildcard": bson.D{ 36 {"path", "title"}, 37 {"query", "Prince*"}, 38 {"allowAnalyzedField", true}, 39 }}, 40 }, 41 }, 42 "sort": bson.D{{"title", 1}}, 43 }}} 44 45 limitStage := bson.D{{"$limit", 5}} 46 projectStage := bson.D{{"$project", bson.D{{"title", 1}, {"_id", 0}, {"score", bson.D{{"$meta", "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 }
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
go run sort-by-strings.go
[{title Prancer} {score 1}] [{title Prancer Returns} {score 1}] [{title Prince} {score 1}] [{title Prince Avalanche} {score 1}] [{title Prince of Broadway} {score 1}]
The Atlas Search results contain documents with movie titles that begin with
Prance
and Prince
. Atlas Search returns titles with Prance
followed by Prince
because Atlas Search sorts documents by the title
field in ascending order.
Run an Atlas Search query against the indexed field and sort the results.
Create a file named
SortByString.java
.Copy and paste the following code into the
SortByString.java
file.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to query and sort the results by a string field. It searches for titles that begin with
Prance
orPrince
and sorts the results by thetitle
field in ascending order.The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
Iterates over the cursor to print the documents that match the query.
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", "sort-tutorial") 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 } Note
To run the sample code in your Maven environment, add the following code above the import statements in your file.
package com.mongodb.drivers; Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.Compile and run the
SortByString.java
file.javac SortByString.java java SortByString {"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} The Atlas Search results contain documents with movie titles that begin with
Prance
andPrince
. Atlas Search returns titles withPrance
followed byPrince
because Atlas Search sorts documents by thetitle
field in ascending order.
Run an Atlas Search query against the indexed field and sort the results.
Create a file named
SortByString.kt
.Copy and paste the following code into the
SortByString.kt
file.The code example performs the following tasks:
Imports
mongodb
packages and dependencies.Establishes a connection to your Atlas cluster.
The following query shows how to query and sort the results by a string field. It searches for titles that begin with
Prance
orPrince
and sorts the results by thetitle
field in ascending order.The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
Prints the documents that match the query from the
AggregateFlow
instance.
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", "sort-tutorial") 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 } Before you run the sample, replace
<connection-string>
with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.Run the
SortByString.kt
file.When you run the
SortByString.kt
program in your IDE, it prints the following documents: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}} The Atlas Search results contain documents with movie titles that begin with
Prance
andPrince
. Atlas Search returns titles withPrance
followed byPrince
because Atlas Search sorts documents by thetitle
field in ascending order.
Copy and paste the following code into the sort-by-strings.js
file.
The code example performs the following tasks:
Imports
mongodb
, MongoDB's Node.js driver.Creates an instance of the
MongoClient
class to establish a connection to your Atlas cluster.The following query shows how to query and sort the results by a string field. It searches for titles that begin with
Prance
orPrince
and sorts the results by thetitle
field in ascending order.The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
Iterates over the cursor to print the documents that match the query.
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': 'sort-tutorial', 22 'compound': { 23 'should': [ 24 { 25 'wildcard': { 26 'query': [ 27 'Prance*' 28 ], 29 'path': 'title', 30 'allowAnalyzedField': true 31 } 32 }, { 33 'wildcard': { 34 'query': [ 35 'Prince*' 36 ], 37 'path': 'title', 38 'allowAnalyzedField': true 39 } 40 } 41 ] 42 }, 43 'sort': { 'title': 1 } 44 } 45 }, { 46 '$limit': 5 47 }, { 48 '$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'} 49 } 50 } 51 ]; 52 53 // run pipeline 54 const result = await coll.aggregate(agg); 55 56 // print results 57 await result.forEach((doc) => console.log(doc)); 58 59 } finally { 60 await client.close(); 61 } 62 } 63 run().catch(console.dir);
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
node sort-by-strings.js
{ title: 'Prancer', score: 1 } { title: 'Prancer Returns', score: 1 } { title: 'Prince', score: 1 } { title: 'Prince Avalanche', score: 1 } { title: 'Prince of Broadway', score: 1 }
The Atlas Search results contain documents with movie titles that begin with
Prance
and Prince
. Atlas Search returns titles with Prance
followed by Prince
because Atlas Search sorts documents by the title
field in ascending order.
Copy and paste the following code into the sort-by-strings.py
file.
The following code example:
Imports
pymongo
, MongoDB's Python driver, and thedns
module, which is required to connectpymongo
toAtlas
using a DNS seed list connection string.Creates an instance of the
MongoClient
class to establish a connection to your Atlas cluster.The following query shows how to query and sort the results by a string field. It searches for titles that begin with
Prance
orPrince
and sorts the results by thetitle
field in ascending order.The query uses the following pipeline stages:
$search
to search thetitle
field using theshould
clause with the wildcard operator to search for titles that begin withPrance
andPrince
. The query also specifies that results must be sorted by thetitle
field in ascending order.$limit
stage to limit the output to5
results.$project
stage to:Exclude all fields except
title
.Add a field named
score
.
Iterates over the cursor to print the documents that match the query.
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': 'sort-tutorial', 11 'compound': { 12 'should': [{'wildcard': {'query': 'Prance*', 'path': 'title', 'allowAnalyzedField': True}}, 13 {'wildcard': {'query': 'Prince*', 'path': 'title', 'allowAnalyzedField': True}}] 14 }, 15 'sort': { 'title': 1 }}}, 16 {'$limit': 5}, 17 {'$project': {'_id': 0, 'title': 1, 'score': {'$meta': 'searchScore'}}} 18 ] 19 20 # run pipeline 21 result = client['sample_mflix']['movies'].aggregate(pipeline) 22 23 # print results 24 for i in result: 25 print(i)
Note
Before you run the sample, replace <connection-string>
with your
Atlas connection string. Ensure that your connection string
includes your database user's credentials. To learn more, see
Connect via Drivers.
Run the following command to query your collection:
python sort-by-strings.py
{'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}
The Atlas Search results contain documents with movie titles that begin with
Prance
and Prince
. Atlas Search returns titles with Prance
followed by Prince
because Atlas Search sorts documents by the title
field in ascending order.
The $search
stage in the sample query uses the
sort option to sort the Atlas Search results regardless
of the letter case of the sorted field value.
In Atlas, go to the Clusters page for your project.
If it is not already displayed, select the organization that contains your desired project from the Organizations menu in the navigation bar.
If it is not already displayed, select your desired project from the Projects menu in the navigation bar.
If the Clusters page is not already displayed, click Database in the sidebar.
Go to the Atlas Search page for your cluster.
You can go the Atlas Search page from the sidebar, the Data Explorer, or your cluster details page.
In the sidebar, click Atlas Search under the Services heading.
From the Select data source dropdown, select your cluster and click Go to Atlas Search.
Click the Browse Collections button for your cluster.
Expand the database and select the collection.
Click the Search Indexes tab for the collection.
Click the cluster's name.
Click the Atlas Search tab.
Run an Atlas Search query against the indexed field and sort the results.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
[ { "$search": { "index": "sort-tutorial", "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
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
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
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Expand your query results.
The Search Tester might not display all the fields in the documents it returns. To view all the fields, including the field that you specify in the query path, expand the document in the results.
Connect to your cluster in mongosh
.
Open mongosh
in a terminal window and connect to your
cluster. For detailed instructions on connecting, see
Connect via mongosh.
Run an Atlas Search query against the indexed field and sort the results.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
db.movies.aggregate( { "$search": { "index": "case-insensitive-sort", "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 } ]
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
[ { _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 } ]
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Connect to your cluster in MongoDB Compass.
Open MongoDB Compass and connect to your cluster. For detailed instructions on connecting, see Connect via Compass.
Run an Atlas Search query against the collection.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
To run this query in MongoDB Compass:
Click the Aggregations tab.
Click Select..., then configure each of the following pipeline stages by selecting the stage from the dropdown and adding the query for that stage. Click Add Stage to add additional stages.
Pipeline StageQuery$search
{ "index": "case-insensitive-sort", "text": { "path": "title", "query": "train", }, "sort": { "title": 1, } } $limit
5
$project
{ "_id": 1, "title": 1, "awards": 1, "score": { $meta: "searchScore" } } If you enabled Auto Preview, MongoDB Compass displays the following documents next to the
$project
pipeline stage:_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 The results contain documents sorted regardless of the letter case. However, if you set
normalizer
tonone
, Atlas Search returns the following results:_id: ObjectId('573a139cf29313caabcf662c') title: 'Atomic Train' awards: Object score: 3.317898988723755 _id: ObjectId('573a13bbf29313caabd52ff4') title: 'How to Train Your Dragon' awards: Object score: 2.228306293487549 _id: ObjectId('573a13ccf29313caabd83281') title: 'How to Train Your Dragon 2' awards: score: 2.0173802375793457 _id: ObjectId('573a13b1f29313caabd36490') title: 'Howard Zinn: You Can't Be Neutral on a Moving Train' awards: Object score: 1.446497917175293 _id: ObjectId('573a13c8f29313caabd78a6b') title: 'Last Train Home' awards: Object score: 2.8655927181243896 To sort your results without normalizing the letter case, set the
normalizer
option tonone
(on line 7) in your index definition, save the index definition, and rerun the query.
Set up and initialize the .NET/C# project for the query.
Create a new directory called
case-insensitive-sort
and initialize your project with the dotnet new command.mkdir case-insensitive-sort cd case-insensitive-sort dotnet new console Add the .NET/C# Driver to your project as a dependency.
dotnet add package MongoDB.Driver
Copy and paste the query into the Program.cs
file.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
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 = "case-insensitive-sort" 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 }
Replace the <connection-string>
in the query and then save the file.
Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Compile and run the Program.cs
file.
dotnet run case-insensitive-sort.csproj
{ "_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 }
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
{ "_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 }
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Copy and paste the query into the case-insensitive-query.go
file.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
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": "case-insensitive-sort", 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 }
Replace the following in the query and then save the file.
<connection-string>
(on line 14) with your Atlas connection string. Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.<database-name>
(on line 21) with the name of the database where you added the collection.
Run the command to query your collection.
go run case-insensitive-query.go
[{_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}]
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
[{_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}]
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Copy and paste the query into the CaseInsensitiveQuery.java
file.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
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", "case-insensitive-sort") 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 }
Replace the <connection-string>
in the query and then save the file.
Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Compile and run the CaseInsensitiveQuery.java
file.
javac CaseInsensitiveQuery.java java CaseInsensitiveQuery
{"_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}
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
{"_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}
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Copy and paste the following code into the CaseInsensitiveQuery.kt
file.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
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", "case-insensitive-sort") 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 }
Replace the <connection-string>
in the query and then save the file.
Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Run the CaseInsensitiveQuery.kt
file.
When you run the CaseInsensitiveQuery.kt
program in your IDE, it prints
the following documents:
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}}
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
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}}
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Copy and paste the sample query into the case-insensitive-query.js
file.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
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': 'case-insensitive-sort', 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);
Replace the <connection-string>
in the query and then save the file.
Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Query your collection.
Run the following command to query your collection:
node case-insensitive-query.js
{ _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 }
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
{ _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 }
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.
Copy and paste the query into the case-insensitive-query.py
file.
The following query shows how to sort the results regardless of the
letter case. It uses the text operator to search for
movies that have the term train
in the title
field and then
sorts the results by the title
field value in ascending order.
The query specifies a $limit
stage to limit the documents
in the results to 5
and a $project
stage to do the
following:
Include only the
_id
,title
, andawards
fields in the results.Add a field named score in the results.
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 { 10 '$search': { 11 'index': 'case-insensitive-sort', 12 'text': { 'path': 'title', 'query': 'train' }, 13 'sort': { 'title': 1 } 14 } 15 }, { 16 '$limit': 5 17 }, { 18 '$project': { '_id': 1, 'title': 1, 'awards': 1, 'score': { '$meta': 'searchScore' } } 19 } 20 ] 21 22 # run pipeline 23 result = client['sample_mflix']['movies'].aggregate(pipeline) 24 25 # print results 26 for i in result: 27 print(i)
Replace the <connection-string>
in the query and then save the file.
Ensure that your connection string includes your database user's credentials. To learn more, see Connect via Drivers.
Run the command to query your collection.
python case-insensitive-query.py
{'_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}
The results contain documents sorted regardless of the letter case.
However, if you set normalizer
to none
, Atlas Search returns the
following results:
{'_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}
To sort your results without normalizing the letter case, set the
normalizer
option to none
(on line 7) in your index
definition, save the index
definition, and rerun the query.