.Net Core使用mongoDB原生语句。新增字段排序。AddFiled

需求: 拉黑记录  ------  表中有拉黑时间,有解封时间,需要排序优先展示封禁中的数据,再展示已经解封的数据。再按照拉黑时间倒叙。因为没有维护状态字段(需要定时轮询修改状态)。所以用语句原生新增字段排序。

mongo语句参考文档:https://dinghuiye.online/article/mongo-aggregate-statement
mongoDb语句:  db.BlackHouses.aggregate([{$match:{EnterDate:{$gte:1604822252}}},{$addFields:{is_Type:{$cond:[{ $gte:["$RevoverDate",1614676433]},1,0]}}}, {$sort:{is_Type: -1,EnterDate: -1}},{$skip: 0},{$limit: 50}])

操作简单介绍:
聚合操作(aggregation operations)可以理解为一系列计算操作的管道(pipeline,我认为翻译为流水线或执行流更容易理解),操作在管道中按阶段执行。操作有如:分组($group)、修改数据结构($project)、排序($sort)、计算数量($count)等,每个操作在管道中叫做阶段(stage),每个阶段执行的结果会给下一个阶段。当管道执行完毕后可以得到新的数据集合(doucments,mongon将一条数据或一条命令语句叫做document,都是BSON结构)。
其中每一个{}里包含的条件都是一个阶段

代码:
 因为需要新增字段排序。但是Linq的写法没找到。只能执行原生的写法。


IList stages = new List();
PipelineStageDefinition stage1 = new JsonPipelineStageDefinition("{$match:{" + string.Join(",", mongoSearchList) + "}}");
PipelineStageDefinition stage2 = new JsonPipelineStageDefinition("{$addFields:{is_Type" +
                    ":{$cond:[{$gte:[\"$RevoverDate\","+DateTime.Now.ToUnixTimestampBySeconds()+"]},1,0]}}}");
PipelineStageDefinition stage3 = new JsonPipelineStageDefinition("{$sort:{is_Type:-1,EnterDate:-1}}");
PipelineStageDefinition stage4 = new JsonPipelineStageDefinition("{$skip:" + pageSize * (pageIndex - 1) + "}");
PipelineStageDefinition stage5 = new JsonPipelineStageDefinition("{$limit:" + pageSize + "}"); 
if (mongoSearchList.Count > 0) stages.Add(stage1);
stages.Add(stage2);
stages.Add(stage3);
stages.Add(stage4);
stages.Add(stage5);
PipelineDefinition pipeline = new PipelineStagePipelineDefinition(stages);
var list = await DbContext.BlackHouses.Aggregate(pipeline).ToListAsync();
                

.Net Core使用mongoDB原生语句。新增字段排序。AddFiled_第1张图片
Mongo驱动提供的aggregate方法需要将参数。按照上面聚合原理。将每个{}内的阶段。拆分成 pipeline  然后执行。

你可能感兴趣的:(.Net,Core,学习总结)