首页 > 解决方案 > 如何使用 .Net Core MongoDB Driver 构建 MongoDB 管道并将阶段附加到管道

问题描述

这是我第一次使用 Net Core 和 MongoDB 创建系统,我设法通过将控制器中的所有输入参数发送到服务层以从 DATABASE 查询来构建具有排序和分页功能的完整工作 CRUD。

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

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

我成功创建了 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**

#示例 1

**if (sortValue.ToUpper() == "DESC")
{
     sortDefinition = sortDefinition.Descending(x => x.ID);
}**

#示例 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**

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

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

Intellisense 建议的管道选择

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

问候,哈兹敏

标签: mongodb.net-coreaggregation-frameworkpipeline

解决方案


我将我的解决方案放在这里以供将来参考,也希望它可以帮助任何尝试使用 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);
}

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

谢谢阅读...

问候, 哈兹敏


推荐阅读