如何使用 .Net Core MongoDB 驱动程序构建 MongoDB 管道并将阶段附加到管道

Haz*_*min 1 pipeline mongodb aggregation-framework .net-core

这是我第一次使用 Net Core 和 MongoDB 创建系统,我通过将控制器中的所有输入参数发送到服务层以从数据库进行查询,成功地构建了具有排序和分页功能的完全可用的 CRUD。

这是我的“获取操作”的输入参数...

 **public IActionResult Get(string userID, string sellerID, DateTime? dateFrom, DateTime? dateTo, string search, string sortValue, string filter, int offset = 0, int limit = 10)**
Run Code Online (Sandbox Code Playgroud)

我成功创建了 FilterdefinitionBuilder 和 SortDefinitionBuilder

**//MongoDB Definition Builder
#region MongoDB Definition builder
FilterDefinitionBuilder<OrderModel> filterBuilder = Builders<OrderModel>.Filter;
FilterDefinition<OrderModel> filterDefinition = filterBuilder.Empty;
             
SortDefinitionBuilder<OrderModel> sortBuilder = Builders<OrderModel>.Sort;
SortDefinition<OrderModel> sortDefinition = sortBuilder.Ascending(x => x.ID);
#endregion**
Run Code Online (Sandbox Code Playgroud)

#例子1

**if (sortValue.ToUpper() == "DESC")
{
     sortDefinition = sortDefinition.Descending(x => x.ID);
}**
Run Code Online (Sandbox Code Playgroud)

#示例2

**//验证日期范围

#region dateFrom and dateTo
if (dateFrom.HasValue && dateTo.HasValue)
{
    if (dateFrom.Value < dateTo.Value.AddDays(1))
    {
    filterDefinition = filterDefinition & filterBuilder.Gte(x => x.CreatedDate, dateFrom.Value) & 
    filterBuilder.Lt(y => y.CreatedDate, dateTo.Value.AddDays(1));
    }
}
#endregion**
Run Code Online (Sandbox Code Playgroud)

我希望完成的是使用构建器创建一个空管道,类似于我使用 sortDefinition 和 filterDefinition 所做的操作,然后当满足某些条件时,创建一个管道阶段并添加到管道中。

我一直在网上寻找答案,但无济于事,但据我所知,我相信我可以删除 sortDefinition 和 filterDefinition ,只使用管道中可用的阶段来完成 CRUD、排序和分页,例如使用“Match”、“排序”、“跳过”、“限制”。但到目前为止我仍然不知道正确的语法

Intellisense 建议的管道选择

请询问是否有人知道如何做到这一点。

问候,哈兹明

Haz*_*min 5

我将我的解决方案放在这里以供将来参考,也希望它可以帮助任何尝试使用 C# 和 mongoDB 创建项目的人。我的目的是创建一个有可能用作静态类的代码;对于每个过滤的 Get 方法可重用的东西。这就是我到目前为止所做的......

[HttpGet]
public IActionResult GetFiltered()
{
    var filter = Builders<User>.Filter;
    var sort = Builders<User>.Sort;
    ProjectionDefinition<User,User> projection = Builders<User>.Projection.Include(x=>x.FirstName);

    PipelineDefinition<User, User> pipeline = new EmptyPipelineDefinition<User>();
    pipeline = pipeline.Match(filter.Eq(x => x.Password, null));
    pipeline = pipeline.Match(filter.Eq(x => x.FirstName, "Hazmin"));
    pipeline = pipeline.Skip(0);
    pipeline = pipeline.Limit(3);
    pipeline = pipeline.Sort(sort.Ascending(x => x.LastName));
    pipeline = pipeline.Project(projection);

var users = _userService.GetAll(pipeline);
return Ok(users);
}
Run Code Online (Sandbox Code Playgroud)

希望它会有所帮助...将很快更新以进行更多升级。

谢谢阅读...

问候, 哈兹明