使用 MongoDB.Driver 在 C# .NETCore 中实现 Mongo DB 过滤器

发布于:2025-09-07 ⋅ 阅读:(20) ⋅ 点赞:(0)

在本文中,我们将了解如何使用.NET 和 C# 来使用MongoDB.Driver中提供的各种过滤器。我们将使用 MongoDB.Driver 包执行各种操作。本文重点介绍 MongoDB 操作,因此我们不会为 .NET 项目实现高级架构。相反,我们将创建一个 .NET 8 Web API 项目,并直接在控制器中实现所有操作,而不是创建单独的服务或存储库类。您可以根据自身需求实现这些架构。

示例代码:https://download.csdn.net/download/hefeng_aspnet/91716842

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。

如果想了解如何在 .NET 项目中配置 MongoDB,并对数据库和集合进行各种操作,可以参考上一篇文章:使用 .NET 实现 MongoDB。使用 C# .NETCore 实现MongoDB

创建集合实例

private readonly IMongoCollection<Employee> _employeeCollection;

public MongoFiltersController(IMongoClient mongoClient, IConfiguration configuration)
{
    var databaseName = configuration.GetValue<string>("MongoDbSettings:DatabaseName");
    var employeeCollection = configuration.GetValue<string>("MongoDbSettings:Collections:EmployeeCollection");
    var database = mongoClient.GetDatabase(databaseName);
    _employeeCollection = database.GetCollection<Employee>(employeeCollection);
}

这段代码设置了一个 MongoDB 集合,供控制器使用。构造函数接受IMongoClientIConfiguration作为参数。它从配置文件中检索数据库和集合名称,并使用mongoClient.GetDatabase(databaseName) 获取数据库实例,然后使用database.GetCollection(employeeCollection)获取 Employee 集合。该集合存储在_employeeCollection字段中,可供控制器内的其他方法使用。此设置允许您对 Employee 集合执行 CRUD 操作。

以下是示例中使用的员工集合。

public class Employee
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Designation { get; set; }
public decimal Salary { get; set; }
public DateTime DateOfBirth { get; set; }
public string[] Skills { get; set; }
}

等于过滤器

[HttpGet("eq")]
public async Task<IActionResult> Equal(string name)
{
    var filter = Builders<Employee>.Filter.Eq(emp => emp.Name, name);
    var results = await _employeeCollection.Find(filter).ToListAsync();
    return Ok(results);
}

MongoDB .NET 驱动程序中的Eq方法用于创建相等性过滤器。此过滤器会选择指定字段与给定值匹配的文档。该方法是FilterDefinitionBuilder类的一部分,可通过 Builders.Filter 访问。

例如,Eq可用于查找集合中特定字段(例如 Name)等于给定值(例如“John Doe”)的所有文档。然后,此过滤器可用于查询,从 MongoDB 集合中检索匹配的文档。Eq方法对于精确过滤至关重要,它可以轻松地基于精确的字段值匹配来查询文档。

不等于过滤器

[ HttpGet( "ne" ) ] 
public  async Task<IActionResult> NotEqual ( string name )
 { 
    var filter = Builders<Employee>.Filter.Ne(emp => emp.Name, name); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Ne方法会创建一个过滤器,用于筛选指定字段不等于给定值的文档。它用于根据精确的字段值匹配来排除文档,为 MongoDB 查询中的精确数据过滤提供必要的功能。

大于过滤器

[ HttpGet( "gt" ) ] 
public  async Task<IActionResult> GreaterThan ( int age )
 { 
    var filter = Builders<Employee>.Filter.Gt(emp => emp.Age, age); 
    //var filter = Builders<Employee>.Filter.Gt(emp => emp.DateOfBirth, DateTime.Now); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Gt方法会构造一个过滤器,用于筛选出指定数字字段(例如intlongdouble)或日期/时间字段(DateTimeDateTimeOffset)大于给定值的文档。它支持这些数据类型,以便在 MongoDB 数据库中进行精确的数据比较。

大于或等于过滤器

[ HttpGet( "gte" ) ] 
public  async Task<IActionResult> GreaterThanOrEqual ( int age )
 { 
    var filter = Builders<Employee>.Filter.Gte(emp => emp.Age, age); 
    //var filter = Builders<Employee>.Filter.Gte(emp => emp.DateOfBirth, DateTime.Now); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Get方法会构造一个过滤器,用于选择指定数字字段(例如intlongdouble)或日期/时间字段(DateTimeDateTimeOffset)大于或等于给定值的文档。此方法扩展了 Gt 的功能,同时还包含字段值与指定值匹配的文档。

小于过滤器

[ HttpGet( "lt" ) ] 
public  async Task<IActionResult> LessThan ( int age )
 { 
    var filter = Builders<Employee>.Filter.Lt(emp => emp.Age, age); 
    //var filter = Builders<Employee>.Filter.Lt(emp => emp.DateOfBirth, DateTime.Now); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Lt方法构造一个过滤器,用于选择指定数字字段(例如intlongdouble)或日期/时间字段(DateTimeDateTimeOffset)小于给定值的文档。此方法对于根据数字或时间条件查询 MongoDB 集合至关重要,有助于进行精确的数据比较。

小于或等于过滤器

[ HttpGet( "lte" ) ] 
public  async Task<IActionResult> LessThanOrEqual ( int age )
 { 
    var filter = Builders.Employee.Filter.Lte(emp => emp.Age, age); 
    //var filter = Builders<Employee>.Filter.Lte(emp => emp.DateOfBirth, DateTime.Now); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Lte方法构造一个过滤器,用于选择指定数字字段(例如intlongdouble)或日期/时间字段(DateTimeDateTimeOffset)小于或等于给定值的文档。此方法支持数字和时间比较,从而可以在 MongoDB 集合中进行精确的数据过滤。

在过滤器中

[ HttpGet( "in" ) ] 
public  async Task<IActionResult> In ( [FromQuery] string [] names )
 { 
    var filter = Builders<Employee>.Filter.In(emp => emp.Name, names); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的In方法会创建一个过滤器,用于筛选出指定字段(本例中为 Name)与指定数组(names)中任意值匹配的文档。此方法简化了基于指定字段的多种可能匹配项的 MongoDB 集合查询,例如,检索员工姓名与 names 数组中任意名称匹配的文档。

不在过滤器中

[ HttpGet( "nin" ) ] 
public  async Task<IActionResult> NotIn ( [FromQuery] string [] names )
 { 
    var filter = Builders<Employee>.Filter.Nin(emp => emp.Name, names); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Nin方法会构建一个过滤器,用于筛选出指定字段(本例中为 Name)与指定数组(名称)中的任何值均不匹配的文档。此方法可用于根据指定字段的多个潜在匹配项从 MongoDB 集合中排除文档。

并过滤

[HttpGet( "and" )] 
public async Task<IActionResult> And(string name, int age) 

    var filter = Builders<Employee>.Filter.And( 
        Builders.Employee.Filter.E q(emp => emp.Name, name) , 
        Builders<Employee>.Filter.E q(emp => emp.Age, age) ); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的And方法可构建一个过滤器,用于筛选多个条件必须同时成立的文档。在本例中,它使用Eq组合两个条件,筛选出Name等于指定姓名且Age等于指定年龄的 Employee 文档。此方法适用于创建需要满足多个条件才能在 MongoDB 集合中选择文档的复杂查询。

或筛选

[ HttpGet( "or" ) ] 
public  async Task<IActionResult> Or ( string name, int age )
 { 
    var filter = Builders.Employee.Filter.Or( 
        Builders<Employee>.Filter.Eq(emp => emp.Name, name), 
        Builders<Employee>.Filter.Eq(emp => emp.Age, age)); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Or方法会构造一个过滤器,用于筛选出满足多个条件中至少一个条件的文档。在本例中,它使用Eq组合两个条件,筛选出Name等于指定姓名或Age等于指定年龄的Employee 文档。此方法对于创建需要包含 MongoDB 集合中满足多个条件之一的文档的查询至关重要。

存在过滤器

[ HttpGet( "exists" ) ] 
public  async Task<IActionResult> Exists ( string fieldName )
 { 
    var filter = Builders.Employee.Filter.Exists(fieldName); 
    // 或
    // var filter = Builders<Employee>.Filter.Exists(x=>x.Designation); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Exists方法构造一个过滤器,用于筛选指定字段存在或不存在的文档。此示例演示了如何筛选指定字段存在的 Employee 文档。此外,还可以修改该方法,通过传递 false 作为第二个参数来筛选指定字段不存在的文档。此方法对于根据特定字段的存在与否来查询 MongoDB 集合至关重要。

类型过滤器

[ HttpGet( "type" ) ] 
public  async Task<IActionResult> Type ( string fieldName, BsonType bsonType )
 { 
    var filter = Builders<Employee>.Filter.Type(fieldName, bsonType); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的 Type 方法会构建一个过滤器,用于筛选指定字段与给定 BSON 类型匹配的文档。方法对于基于数据类型查询 MongoDB 集合至关重要,可确保根据特定的BSON类型条件进行精确的数据检索。

正则表达式过滤器

[ HttpGet( "regex" ) ] 
public  async Task<IActionResult> Regex ()
 { 
    var pattern = "^J" ; // 以 'J' 开头的名称
    //var pattern = "n$"; // 以 'n' 结尾的名称
    //var pattern = ".[aei]."; // 包含 'a'、'e' 或 'i' 的名称
    //..... 以及更多
    var filter = Builders<Employee>.Filter.Regex(emp => emp.Name, new BsonRegularExpression(pattern)); var 
    results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Regex方法会创建一个过滤器,用于查找指定字段与正则表达式定义的模式匹配的文档。此方法适用于字符串字段,允许您执行高级文本搜索和过滤。它可以帮助您查找包含符合复杂模式的文本的文档,从而为您提供强大的数据搜索方法。

全部筛选

[ HttpGet( "all" ) ] 
public  async Task<IActionResult> All ( [FromQuery] string [] skill )
 { 
    var filter = Builders<Employee>.Filter.All(emp => emp.Skills, skill); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的All方法构造一个过滤器,用于筛选数组字段包含指定数组所有元素的文档。在本例中,它筛选了Skills 数组包含所有指定技能的 Employee 文档。此方法对于根据数组内容查询 MongoDB 集合非常有用。

ElemMatch 过滤器

[ HttpGet( "elemMatch" ) ] 
public  async Task<IActionResult> ElemMatch ( string skill )
 { 
    var filter = Builders<Employee>.Filter.ElemMatch(emp => emp.Skills, skill); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的ElemMatch方法构造一个过滤器,用于筛选出数组字段中至少有一个元素符合指定条件的文档。在本例中,它筛选出Skills 数组中至少有一个元素符合指定技能的 Employee 文档。此方法对于根据应用于数组元素的条件查询 MongoDB 集合至关重要。

尺寸过滤器

[ HttpGet( "size" ) ] 
public  async Task<IActionResult> Size ( int size )
 { 
    var filter = Builders<Employee>.Filter.Size(emp => emp.Skills, size); 
    var results = await _employeeCollection.Find(filter).ToListAsync(); 
    return Ok(results); 
}

MongoDB .NET 驱动程序中的Size方法构造一个过滤器,用于筛选数组字段具有指定大小的文档。在本例中,它筛选了Skills 数组具有指定元素数量的 Employee 文档。此方法对于根据数组字段的大小查询 MongoDB 集合非常有用。

结论

在本文中,我们使用 .NET 和 C# 探索了MongoDB.Driver包中可用的各种 MongoDB 过滤器。这些过滤器允许您在 MongoDB 集合中执行各种数据查询操作。

示例代码:https://download.csdn.net/download/hefeng_aspnet/91716842

如果您喜欢此文章,请收藏、点赞、评论,谢谢,祝您快乐每一天。


网站公告

今日签到

点亮在社区的每一天
去签到