mongodb - 如何使用 .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、排序和分页,例如“匹配”,”排序","跳过","限制"。但是直到现在我仍然不知道正确的语法
请询问是否有人知道如何做到这一点。
问候,哈兹敏
解决方案
我将我的解决方案放在这里以供将来参考,也希望它可以帮助任何尝试使用 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);
}
希望它会有所帮助...将很快更新以进行更多升级。
谢谢阅读...
问候, 哈兹敏
推荐阅读
- drupal - Drupal 7 文件上传字段为空
- c++ - 调试时的 C++ 计时
- postgresql - 聚合嵌套 Pgsql 查询
- python - Pandas Groupby Divide by Last in Sequence by Unique Key
- .net - 'MsgBox' 未声明。由于其保护级别,它可能无法访问
- asp.net - MVC Core 2.0 中的控制器无法识别会话值。“可空对象必须有一个值。”
- c# - 如何防止 Asp.Net Core 从运行时存储引用依赖项
- javascript - 在用户刷新页面之前更改 url 搜索
- vba - 在 Excel 中对宏列表进行排序
- php - Calling a python script from PHP, facing issue related to writing, reading of file when open on browser