.netcore mongodb 分页+模糊查询+多条件查询
2024-10-19 15:33:04
.netcore MongoDB.Driver 版本才2.8 与aspnet差距太大,网上找很多资料没有现成的代码。
public override async Task<PagerList<NewsContentDto>> PagerQueryAsync(NewsContentQuery parameter)
{
FilterDefinitionBuilder<NewsContentDto> builder = Builders<NewsContentDto>.Filter;
string p = parameter.Keyword == null? $".*{Regex.Escape("")}.*": $".*{Regex.Escape(parameter.Keyword)}.*";
FilterDefinition <NewsContentDto> filter2 = builder.Regex("title", new BsonRegularExpression(new Regex(p, RegexOptions.IgnoreCase)));
//var filter1 = Builders<T>.Filter.Regex("title", new BsonRegularExpression(new Regex(".*" + Regex.Escape("英超") + ".*", RegexOptions.IgnoreCase)));
//var filter1 = Filter.Regex(x => x.EnglishName, new MongoDB.Bson.BsonRegularExpression(parameter.Keyword, "i"));
//BsonDocument filter = new BsonDocument {{"title", $"/{parameter.Keyword}/" } };
//if(parameter.classifyId>0) filter.Add("classifyId", parameter.classifyId); var query = new QueryMongoParameter<NewsContentDto>(parameter, "news_content", filter2);
var ret = await MongoContext.PagerQueryAsync(query);
return ret;
}
分页查询
public async Task<PagerList<T>> PagerQueryAsync<T>(QueryMongoParameter<T> query)
{
var skip = (query.Page - ) * query.PageSize;
var collection = _database.GetCollection<T>(query.CollectName);
var data = await collection.Find(query.Filter).Sort(query.Sort).Project(query.Projection).Skip(skip).Limit(query.PageSize).ToListAsync();
var total = await collection.CountAsync(query.Filter);
var ret = new List<T>();
data.ForEach(d =>
{
string s = d.ToString().Replace("\"_id\"", "\"id\"");
ret.Add(Helpers.Json.ToObject<T>(s));
});
return new PagerList<T>(query.Page, query.PageSize, (int)total, ret);
}
补充
public class PageMongoParameter : ParameterBase
{
public BsonDocument Sort { get; }
public BsonDocument Skip { get; }
public BsonDocument Limit { get;}
public BsonDocument Filter2 { get; } public BsonDocument[] Pipeline { get; set; }
public PageMongoParameter(PageRequest req, string collectName, BsonDocument filter=null,BsonDocument sort=null, BsonDocument filter2 = null)
{
CollectName = collectName;
Page = req.pageindex;
PageSize = req.pagesize;
Limit = new BsonDocument { { "$limit", PageSize } };
Skip = new BsonDocument { { "$skip", (Page-)*PageSize} }; if (sort == null)
{
if (!string.IsNullOrEmpty(req.order)) Sort = new BsonDocument { { "$sort", new BsonDocument { { req.order, } } } };
}
else
{
Sort = sort;
} if (filter != null && filter2==null)
{
var dom = filter.GetElement();
Filter2 = BsonDocument.Parse(dom.Value.ToJson());
}
Filter2 = Filter2 ?? new BsonDocument(); if (filter == null && Sort == null)
Pipeline = new[] {Skip, Limit};
else
{
if(filter!=null && Sort != null)
Pipeline = new[] { filter,Skip, Limit,Sort };
else
Pipeline = filter == null ? new[] {Skip, Limit, Sort} : new[] { filter,Skip, Limit};
}
} }
最新文章
- codeforces 744C Hongcow Buys a Deck of Cards
- Bootstrap-datetimepicker年月日
- Android 坐标与宽高研究getLeft() getTop() getRight()和getBottom()
- 2013年山东省第四届ACM大学生程序设计竞赛-最后一道大水题:Contest Print Server
- 利用JS实现的根据经纬度计算地球上两点之间的距离
- eclipse启动出现“An Error has Occurred. See the log file”解决方法
- Adobe Illustrator CS6 绿色简体中文版下载地址
- JVM的组成部分与内存管理
- Cocos2d-x 3.1.1 Lua实例-AccelerometerTest(重力加速计)
- OAuth和OpenID的区别(转)
- 读书笔记 effective c++ Item 46 如果想进行类型转换,在模板内部定义非成员函数
- 【USACO】电子游戏 有条件的背包
- Response.Write()方法响应导致页面字体变大的解决办法
- IdentityServer4 中文文档 -5- (简介)支持和咨询选项
- 一本通1619【例 1】Prime Distance
- pycharm换行
- Java Runnable与Callable区别
- web.xml 配置中classpath: 与classpath*:的区别——(十一)
- hdu 5687 Problem C trie树
- QueryRunner(DBUtils) 结果集实例