- Reference
- Driver
- Definitions and Builders
- Expressions
Expressions
Many methods in the driver accept expressions as an argument.
For the rest of this page, we’ll use the following class:
class Person { public string Name { get; set; } public int Age { get; set; } public IEnumerable<Pet> Pets { get; set; } public int[] FavoriteNumbers { get; set; } public HashSet<string> FavoriteNames { get; set; } public DateTime CreatedAtUtc { get; set; } } class Pet { public string Name { get; set; } } Filters
We’ll walk through the supported expressions below. The tests are also a good reference.
Comparison
See the MongoDB documentation for more information on each operator.
$eq
Find(p => p.Name == "Jack") becomes:
{ Name: 'Jack' } Note
This is the short form for equality. Depending on context, this might generate{ Name: { $eq: 'Jack' } }. $gt
Find(p => p.Age > 10); { Age: { $gt: 10 } } $gte
Find(p => p.Age >= 10); { Age: { $gte: 10 } } $lt
Find(p => p.Age < 10); { Age: { $lt: 10 } } $lte
Find(p => p.Age <= 10); { Age: { $lte: 10 } } $ne
Find(p => p.Age != 10); { Age: { $ne: 10 } } $in
int[] localAges = new [] { 10, 20, 30 }; Find(p => localAges.Contains(p.Age)); { Age: { $in: [10, 20, 30] } } $nin
int[] localAges = new [] { 10, 20, 30 }; Find(p => !localAges.Contains(p.Age)); { Age: { $nin: [10, 20, 30] } } Logical
See the MongoDB documentation for more information on each operator.
$or
Find(p => p.Name == "Jack" || p.Age == 10); { $or: [{ Name: 'Jack' }, { Age: 10 }] } $and
Find(p => p.Name == "Jack" && p.Age < 40); { Name: 'Jack', Age: { $lt: 40 } } Find(p => p.Age > 30 && p.Age < 40); { Age: { $gt: 30, $lt: 40 } Find(p => p.Name != "Jack" && p.Name != "Jim"); { $and: [{ Name: { $ne: 'Jack' } }, { Name: { $ne: 'Jim' } }] } $not
// no example yet $nor
// no example yet Element
See the MongoDB documentation for more information on each operator.
$exists
// no example yet $type
// no example yet Evaluation
See the MongoDB documentation for more information on each operator.
$mod
// no example yet $regex
// no example yet $text
// no example yet $where
// no example yet Geospatial
See the MongoDB documentation for more information on each operator.
$geoWithin
// no example yet $geoIntersects
// no example yet $near
// no example yet $nearSphere
// no example yet Geospatial
See the MongoDB documentation for more information on each operator.
$all
// no example yet $elemMatch
Find(x => x.Pets.Any(p => p.Name == "Fluffy"); { Pets: { $elemMatch: { Name: 'Fluffy' } } } Find(x => x.FavoriteNumbers.Any(n => n > 21)); { FavoriteNumbers: { $elemMatch: { { $gt: 21 } } } } $size
Find(x => x.FavoriteNumbers.Length == 3); { FavoriteNumbers: { $size: 3 } } Find(x => x.FavoriteNumbers.Length != 3); { FavoriteNumbers: { $not: { $size: 3 } } } Find(x => x.FavoriteNumbers.Any()); { FavoriteNumbers: { $ne: null, $not: { $size: 0 } } } Find(x => x.FavoriteNumbers.Count() == 3); { FavoriteNumbers: { $size: 3 } } Aggregation Projections
We’ll walk through the supported expressions below. The tests are also a good reference.
Boolean Expressions
See the MongoDB documentation for more information on each operator.
$and
p => p.Name == "Jack" && p.Age < 40 { $and: [{ $eq: ['$Name', 'Jack'] }, { $lt: ['$Age', 40] }] } $or
p => p.Name == "Jack" || p.Age < 40 { $or: [{ $eq: ['$Name', 'Jack'] }, { $lt: ['$Age', 40] }] } $not
p => !(p.Name == "Jack") { $not: [{ $eq: ['$Name', 'Jack'] }]] } Set Expressions
See the MongoDB documentation for more information on each operator.
$setEquals
p => p.FavoriteNames.SetEquals(new [] { "Jack", "Jane" }); { $setEquals: ['$FavoriteNames', [ 'Jack', 'Jane'] ] } var localSet = new HashSet<int>(new [] { 1, 3, 5 }); p => localSet.SetEquals(p.FavoriteNumbers); { $setEquals: [ [1, 3, 5], '$FavoriteNumbers' ] } $setIntersection
p => p.FavoriteNumbers.Intersect(new [] { 1, 3 }); { $setIntersection: [ '$FavoriteNumbers', [ 1, 3 ] ] } p => new [] { 1, 3 }.Intersect(p.FavoriteNumbers); { $setIntersection: [ [ 1, 3 ], '$FavoriteNumbers' ] } $setUnion
p => p.FavoriteNumbers.Union(new [] { 1, 3 }); { $setUnion: [ '$FavoriteNumbers', [ 1, 3 ] ] } p => new [] { 1, 3 }.Union(p.FavoriteNumbers); { $setUnion: [ [ 1, 3 ], '$FavoriteNumbers' ] } $setDifference
p => p.FavoriteNumbers.Except(new [] { 1, 3 }); { $setDifference: [ '$FavoriteNumbers', [ 1, 3 ] ] } p => new [] { 1, 3 }.Except(p.FavoriteNumbers); { $setDifference: [ [ 1, 3 ], '$FavoriteNumbers' ] } $setIsSubset
p => p.FavoriteNames.IsSubsetOf(new [] { "Jack", "Jane" }); { $setIsSubset: ['$FavoriteNames', [ 'Jack', 'Jane'] ] } var localSet = new HashSet<int>(new [] { 1, 3, 5 }); p => localSet.IsSubsetOf(p.FavoriteNumbers); { $setIsSubset: [ [1, 3, 5], '$FavoriteNumbers' ] } $anyElementTrue
p => p.FavoriteNumbers.Any(x => x > 20); { $anyElementTrue: { $map: { input: '$FavoriteNumbers', as: 'x', in: { $gt: [ '$$x', 20 ] } } } } $allElementsTrue
p => p.FavoriteNumbers.All(x => x > 20); { $allElementsTrue: { $map: { input: '$FavoriteNumbers', as: 'x', in: { $gt: [ '$$x', 20 ] } } } } Comparison Expressions
See the MongoDB documentation for more information on each operator.
$cmp
p => p.Name.CompareTo("Jimmy"); { $cmp: [ '$Name', 'Jimmy' ] } $eq
p => p.Name == "Jimmy"; { $eq: [ '$Name', 'Jimmy' ] } $gt
p => p.Age > 20; { $gt: [ '$Age', 20 ] } $gte
p => p.Age >= 20; { $gte: [ '$Age', 20 ] } $lt
p => p.Age < 20; { $lt: [ '$Age', 20 ] } $lte
p => p.Age <= 20; { $lte: [ '$Age', 20 ] } $ne
p => p.Age != 20; { $ne: [ '$Age', 20 ] } Arithmetic Expressions
See the MongoDB documentation for more information on each operator.
$add
p => p.Age + 2; { $add: [ '$Age', 2 ] } $subtract
p => p.Age - 2; { $subtract: [ '$Age', 2 ] } $multiply
p => p.Age * 2; { $multiply: [ '$Age', 2 ] } $divide
p => p.Age / 2; { $divide: [ '$Age', 2 ] } $mod
p => p.Age % 2; { $mod: [ '$Age', 2 ] } String Expressions
See the MongoDB documentation for more information on each operator.
$concat
p => p.Name + "Awesome"; { $concat: [ '$Name', 'Awesome' ] } $substr
p => p.Name.Substring(3, 20) { $substr: [ '$Name', 3, 20 ] } $toLower
p => p.Name.ToLower() { $toLower: '$Name' } $toUpper
p => p.Name.ToUpper() { $toUpper: '$Name' } $strcasecmp
You must use StringComparison.OrdinalIgnoreCase for this method.
p => p.Name.Equals("balloon", StringComparison.OrdinalIgnoreCase); { $strcasecmp: ['$Name', 'balloon' ] } Text Search Expressions
See the MongoDB documentation for more information on each operator.
$meta
// no example yet Array Expressions
See the MongoDB documentation for more information on each operator.
$size
p => p.FavoriteNumbers.Length; { $size: '$FavoriteNumbers' } p => p.FavoriteNumbers.Count(); { $size: '$FavoriteNumbers' } Variable Expressions
See the MongoDB documentation for more information on each operator.
$map
p => p.Pets.Select(x => x.Name + " is awesome"); { $map: { input: '$Name', as: 'x', in: { $concat: [ '$$x', ' is awesome' ] } } } $let
// no example yet Literal Expressions
See the MongoDB documentation for more information on each operator.
$literal
The only time $literal will be used from the driver is if the constant starts with a $.
p => p.Name == "$1"); { $eq: [ '$Name', { $literal: '$1' } ] } Date Expressions
See the MongoDB documentation for more information on each operator.
$dayOfYear
p => p.CreatedAtUtc.DayOfYear); { $dayOfYear: '$CreatedAtUtc' } $dayOfMonth
p => p.CreatedAtUtc.Day); { $dayOfMonth: '$CreatedAtUtc' } $dayOfWeek
The .NET constant for day of week is 1 less than that in MongoDB. As such, we must subtract 1 from the MongoDB version in order for mapping back to the .NET type to be accurate.
p => p.CreatedAtUtc.DayOfWeek); { $subtract: [ { $dayOfWeek: '$CreatedAtUtc' }, 1 ] } $year
p => p.CreatedAtUtc.Year); { $year: '$CreatedAtUtc' } $month
p => p.CreatedAtUtc.Month); { $month: '$CreatedAtUtc' } $week
// no example yet $hour
p => p.CreatedAtUtc.Hour); { $hour: '$CreatedAtUtc' } $minute
p => p.CreatedAtUtc.Minute); { $minute: '$CreatedAtUtc' } $second
p => p.CreatedAtUtc.Second); { $second: '$CreatedAtUtc' } $millisecond
p => p.CreatedAtUtc.Millisecond); { $millisecond: '$CreatedAtUtc' } $dateToString
// no example yet Conditional Expressions
See the MongoDB documentation for more information on each operator.
$cond
p => p.Name == "Jack" ? "a" : "b"; { $cond: [ { $eq: [ '$Name', 'Jack' ] }, 'a', 'b' ] } $ifNull
p => p.Name ?? "awesome"; { $ifNull: [ '$Name', 'awesome' ] } Accumulators
See the MongoDB documentation for more information on each operator.
Also, the tests are a good reference.
Note
These are only supported in a grouping expression.In the examples below, it should be assumed that g is of type IGrouping<TKey, TElement>.
$sum
g => g.Sum(x => x.Age); { $sum: '$Age' } g => g.Count() { $sum: 1 } $avg
g => g.Average(x => x.Age); { $avg: '$Age' } $first
g => g.First().Age); { $first: '$Age' } $last
g => g.Last().Age); { $last: '$Age' } $max
g => g.Max(x => x.Age); { $max: '$Age' } $min
g => g.Min(x => x.Age); { $min: '$Age' } $push
g => g.Select(p => p.Name) { $push: '$Name' } g => g.Select(p => p.Name).ToArray() { $push: '$Name' } g => g.Select(p => p.Name).ToList() { $push: '$Name' } $addToSet
g => new HashSet<string>(g.Select(p => p.Name)); { $addToSet: '$Name' } g => g.Select(p => p.Name).Distinct(); { $addToSet: '$Name' }