'MongoDB .NET Driver - StartsWith & Contains with loosely typed data

I can use the following for exact matches on loosely typed data in MongoDB:

var mongoClient = new MongoClient(con);
IMongoDatabase mongoDatabase = mongoClient.GetDatabase("mydb");
var profile = mongoDatabase.GetCollection<BsonDocument>("profiles");
var query = profile.AsQueryable();

var results = query.Where(x => x["first_name"] == "john").Take(10);

But how do I use the same approach to do StartsWith and Contains?

I tried:

var results = query.Where(x => x["first_name"].AsString.Contains("john")).Take(10);

But I get the error:

Method 'Boolean Contains(System.String)' declared on type 'System.String' cannot be called with an instance of type 'MongoDB.Bson.BsonValue'

How do I use these filters?



Solution 1:[1]

If you cast to string instead of using AsString, it should work:

var results = query.Where(x => ((string) x["first_name"]).Contains("john")).Take(10);

Solution 2:[2]

MongoDB .NET Driver provides LinqExtensions.Inject that you can inject FilterDefinition into a LINQ where clause.

Start with Filter

using MongoDB.Driver.Linq;

var filter = Builders<BsonDocument>
    .Filter
    .Regex("first_name", "^" + "john" + ".*");

var results = query.Where(x => filter.Inject())
    .Take(10);

Contains Filter

using MongoDB.Driver.Linq;

var filter = Builders<BsonDocument>
    .Filter
    .Regex("first_name", "john");

var results = query.Where(x => filter.Inject())
    .Take(10);

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1 Brian Berns
Solution 2