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

How to build MongoDB pipeline and append stages to the pipeline using .Net Core MongoDB Driver

这是我第一次使用 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)**

我成功创建了 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,排序和分页,例如“匹配”、“排序”、“跳过”、“限制”。但是到现在我还是不知道正确的语法

Pipeline choices suggested by Intellisense

请问是否有人知道如何完成此操作。

注意, 哈兹敏

欢迎来到 Stack Overflow。

这里有一个 video example 说明如何获得有关如何为 C# 构建管道的示例。我希望它有所帮助。我还发布了视频中生成的代码。顺便说一句,这在 Atlas UI.

的浏览器中也可用
new BsonArray
{
    new BsonDocument("$search", 
    new BsonDocument("search", 
    new BsonDocument
            {
                { "query", "Terasse" }, 
                { "path", "Entity.Name" }
            }))
}

请注意,此代码是由 Compass 生成的,您可能需要测试将第二个 new BsonDocument("search") 更改为 new BsonDocument("text"),因为搜索运算符已被弃用。不过,$search 聚合管道阶段仍然正确。

我将我的解决方案放在这里以供将来参考,也希望它能帮助任何尝试使用 C# 和 mongoDB 创建项目的人。我的意图是创建一个有可能用作静态 class 的代码;每个过滤的 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);
}

希望它能有所帮助...将很快更新更多升级。

感谢阅读...

此致, 哈兹敏