/mongo-csharp-search

C# driver extension providing support for Atlas Search

Primary LanguageC#Apache License 2.0Apache-2.0

MongoDB C# Driver Extension for Atlas Search

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.

Examples

C# Objects

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();

BSON Documents

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();

Autocomplete Operator

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();

Compound Operator

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();

Equals Operator

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();

Exists Operator

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();

More Like This Operator

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();

Near Operator

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();

Phrase Operator

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();

Query String Operator

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();

Range Operator

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.

Regular Expression Operator

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.

Text Operator

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();

Wildcard Operator

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();