This library is an extension to the MongoDB C# driver providing support for the
$search
stage used with Atlas Search. You can gain access to the extension
methods for Atlas search by adding a reference to the library in your project
and using the MongoDB.Labs.Search
namespace.
This repository is NOT a supported MongoDB product.
You can get the latest release from the NuGet feed or from the GitHub releases page.
Perform a search for C# objects, specifying field names as expression trees.
public class HistoricalDocument
{
[BsonId]
public ObjectId Id { get; set; }
[BsonElement("body")]
public string Body { get; set; }
[BsonElement("title")]
public string Title { get; set; }
[BsonElement("highlights")]
public List<Highlight> Highlights { get; set; }
[BsonElement("score")]
public double Score { get; set; }
}
List<HistoricalDocument> results = coll.Aggregate()
.Search(
SearchBuilders<HistoricalDocument>.Search
.Phrase("life, liberty, and the pursuit of happiness", x => x.Body, 5),
SearchBuilders<HistoricalDocument>.Highlight
.Options(x => x.Body))
.Limit(10)
.Project<HistoricalDocument>(
Builders<HistoricalDocument>.Projection
.Include(x => x.Title)
.Include(x => x.Body)
.MetaSearchHighlights("highlights")
.MetaSearchScore("score"))
.ToList();
Perform a search for raw BSON documents, specifying field names as strings.
List<BsonDocument> results = coll.Aggregate()
.Search(
SearchBuilders<BsonDocument>.Search
.Phrase("life, liberty, and the pursuit of happiness", "body", 5),
SearchBuilders<BsonDocument>.Highlight
.Options("body"))
.Limit(10)
.Project<BsonDocument>(
Builders<BsonDocument>.Projection
.Include("title")
.Include("body")
.MetaSearchHighlights("highlights")
.MetaSearchScore("score"))
.ToList();
Search for instances of HistoricalDocument
in which the Body
field matches the autocomplete
query life, liber
.
List<HistoricalDocument> results = coll.Aggregate()
.Search(
SearchBuilders<HistoricalDocument>.Search
.Autocomplete("life, liber", x => x.Body, AutocompleteTokenOrder.Sequential))
.ToList();
Search for instances of HistoricalDocument
in which the Body
field contains the text life
and liberty
but not property
.
List<HistoricalDocument> results = coll.Aggregate()
.Search(
SearchBuilders<HistoricalDocument>.Search
.Compound()
.Must(
SearchBuilders<HistoricalDocument>.Search
.Text("life", x => x.Body),
SearchBuilders<HistoricalDocument>.Search
.Text("liberty", x => x.Body))
.MustNot(
SearchBuilders<HistoricalDocument>.Search
.Text("property", x => x.Body)))
.ToList();
Search for instances of Person
in which the Retired
field is set to true.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.Eq(x => x.Retired, true))
.ToList();
Search for instances of Person
in which the MiddleName
field exists.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.Exists(x => x.MiddleName))
.ToList();
Search for instances of Person
similar to the specified instance.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.MoreLikeThis(
new Person
{
FirstName = "John",
LastName = "Doe"
}))
.ToList();
Search for instances of Person
in which the Age
field is near 18 with a pivot of 1.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.Near(x => x.Age, 18, 1))
.ToList();
Search for instances of HistoricalDocument
in which the Body
field contains the phrase
life, liberty, and the pursuit of happiness
.
List<HistoricalDocument> results = coll.Aggregate()
.Search(
SearchBuilders<HistoricalDocument>.Search
.Phrase("life, liberty, and the pursuit of happiness", x => x.Body))
.ToList();
Search for instances of Person
matching the query string firstName:john lastName:doe
using
the FirstName
field as the default when no field is specified in the query string.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.QueryString(x => x.FirstName, "firstName:john lastName:doe"))
.ToList();
Search for instances of Person
in which the Age
field is greater than or equal to 18 and less
than 21.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.RangeInt32(x => x.Age).Gte(18).Lt(21))
.ToList();
The search operator functions RangeInt64
, RangeDouble
, and RangeDateTime
are also available
to perform range searches for their respective data types. Every range search must include a lower
bound using Gt
(greater than) or Gte
(greater than or equal to) and an upper bound using Lt
(less than) or Lte
(less than or equal to). The order of the bounds does not matter.
Search for instances of Person
in which the FirstName
field matches the regular expression
joh?n
.
List<Person> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.Regex("joh?n", x => x.FirstName))
.ToList();
Regular expressions must be specified using the Lucene syntax.
Search for instances of HistoricalDocument
in which the Body
field contains the text
life, liberty, and the pursuit of happiness
.
List<HistoricalDocument> results = coll.Aggregate()
.Search(
SearchBuilders<Person>.Search
.Text(x => x.Body, "life, liberty, and the pursuit of happiness"))
.ToList();
Search for instances of HistoricalDocument
in which the Body
field matches the wildcard string
happ*
.
List<HistoricalDocument> results = coll.Aggregate()
.Search(
SearchBuilders<HistoricalDocument>.Search
.Wildcard("happ*", x => x.Body))
.ToList();