本文将带您了解关于.NetCore对MongoDB执行多条件查询的新内容,同时我们还将为您解释.netcoremongodb的相关知识,另外,我们还将为您提供关于.Netcore----使用Mongo
本文将带您了解关于.Net Core对MongoDB执行多条件查询的新内容,同时我们还将为您解释.net core mongodb的相关知识,另外,我们还将为您提供关于.Net core---- 使用 Mongo 多条件查询、.Net Core如何对MongoDB执行多条件查询、.netcore mongodb 分页+模糊查询+多条件查询、c# MongoDB 分页辅助类,支持多条件查询的实用信息。
本文目录一览:- .Net Core对MongoDB执行多条件查询(.net core mongodb)
- .Net core---- 使用 Mongo 多条件查询
- .Net Core如何对MongoDB执行多条件查询
- .netcore mongodb 分页+模糊查询+多条件查询
- c# MongoDB 分页辅助类,支持多条件查询
.Net Core对MongoDB执行多条件查询(.net core mongodb)
以前项目基本上全部使用MysqL数据库, 最近项目排期空出了一点时间leader决定把日志模块迁移到插入/查询性能更好的MongoDB上. 多条件查询的写法着实费了些功夫, 撰文记录一下.
相关学习推荐:C#.Net开发图文教程
一、准备工作
1. 安装过程, 不赘述了
2. 添加ReferencePackage
dotnet add package mongodb.bson dotnet add package mongodb.driver
3. appsetting.json添加连接配置
MongodbHost: { Connection: mongodb://[username]:[password]@[ip]:[port], DataBase: [database], Table: },
4. 获取MongoDBConfig 的方法
public static MongodbHostOptions MongodbConfig() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile(appsettings.json); IConfiguration Configuration = builder.Build(); var option = Configuration.GetSection(MongodbHost); return new MongodbHostOptions { Connection = option[Connection], DataBase = option[DataBase], Table = option[Table] }; }
二、查询方法
这里的查询方法是网上找的, 直接拿来用了. 如果是单一数据源的话, 这里的host可以提取出来成为helper类的属性.
#region FindListByPage 分页查询集合 /// <summary> /// 分页查询集合 /// </summary> /// <param name=filter>查询条件</param> /// <param name=pageIndex>当前页</param> /// <param name=pageSize>页容量</param> /// <param name=count>总条数</param> /// <param name=field>要查询的字段,不写时查询全部</param> /// <param name=sort>要排序的字段</param> /// <returns></returns> public static List<T> FindListByPage(FilterDeFinition<T> filter, int pageIndex, int pageSize, out int count, string[] field = null, SortDeFinition<T> sort = null) { try { MongodbHostOptions host = Tools.AppSettingsTools.MongodbConfig(); host.Table = WSMessageLog; var client = MongodbClient<T>.MongodbInfoClient(host); count = Convert.ToInt32(client.CountDocuments(filter)); //不指定查询字段 if (field == null || field.Length == 0) { if (sort == null) return client.Find(filter).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); //进行排序 return client.Find(filter).sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); } //指定查询字段 var fieldList = new List<ProjectionDeFinition<T>>(); for (int i = 0; i < field.Length; i++) { fieldList.Add(Builders<T>.Projection.Include(field[i].ToString())); } var projection = Builders<T>.Projection.Combine(fieldList); fieldList?.Clear(); //不排序 if (sort == null) return client.Find(filter).Project<T>(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); //排序查询 return client.Find(filter).sort(sort).Project<T>(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); } catch (Exception ex) { throw ex; } } #endregion
三、调用查询方法
这里还踩了一个坑. MongoDB里存储的时间是格林尼治时间, 插入8:00, 查询时会发现变成了0:00,所以定义时间属性的时候需要加个标签
[BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime logtime { get; set; }
这里的OprLogModel是定义了查询条件的类.
public static LogPager<log_operate> Get_operate_log_mongo(OprLogModel qModel) { LogPager<log_operate> pager = new LogPager<log_operate>(); FilterDeFinition<log_operate> filters; var sortbuilder = Builders<log_operate>.sort; var sort = sortbuilder.Descending(operate_time); #region 用户权限过滤 IEnumerable<string> IdList = dev_deviceRepository.GetBinding(qModel.user_id); filters = Builders<log_operate>.Filter.In(device_id, IdList); #endregion if (!string.IsNullOrEmpty(qModel.device_id)) { var filters_did = Builders<log_operate>.Filter.Eq(device_id, qModel.device_id); filters = Builders<log_operate>.Filter.And(filters, filters_did); } if (qModel.sDate != null) { var filters_sdate = Builders<log_operate>.Filter.Gte<DateTime>(operate_time, Convert.ToDateTime(qModel.sDate)); filters = Builders<log_operate>.Filter.And(filters, filters_sdate); } if (qModel.eDate != null) { var filters_edate = Builders<log_operate>.Filter.Lte<DateTime>(operate_time, Convert.ToDateTime(qModel.eDate)); filters = Builders<log_operate>.Filter.And(filters, filters_edate); } int total; pager.data = MongoTools<log_operate>.FindListByPage(filters, qModel.pageindex, (qModel.pageindex - 1) * qModel.pagesize, out total, null, sort); pager.total = total; return pager; } #endregion
也可以先定义一个空的filterdeFinition, 然后与各查询条件通过And聚合:
FilterDeFinition<log_operate> filters = FilterDeFinition<log_operate>.Empty; var filters_idlist = Builders<log_operate>.Filter.In(device_id, IdList); filters = Builders<log_operate>.Filter.And(filters, filters_idlist);
.Net core---- 使用 Mongo 多条件查询
直接上干货
数据库连接:
MongoClient clients = new MongoClient(_ibcoptions.Value.MongoConnStr);//配置文件读取
//获取指定数据库
IMongoDatabase dbs = clients.GetDatabase(_ibcoptions.Value.MongoDbName);
//获取指定集合 BsonDocument数据库文档对象
IMongoCollection<BsonDocument> coll = dbs.GetCollection<BsonDocument>("ibeaconlocus");
多添加查询:
//创建约束生成器
FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter;
//排序生成器
SortDefinitionBuilder<BsonDocument> builderSort = Builders<BsonDocument>.Sort;
//排序约束 Ascending 正序 Descending 倒序
SortDefinition<BsonDocument> sort = builderSort.Descending("timestamp");
//约束条件
FilterDefinition<BsonDocument> filter = builderFilter.And(builderFilter.Eq("userId", userid),
//gte: 大于等于,lte小于等于
builderFilter.Gte("timestamp", endTime.ToString()), builderFilter.Lte("timestamp", sartTime.ToString()));
//获取数据
var result = coll.Find<BsonDocument>(filter).ToList();
取值:
foreach (var item in result)
{
//判断是否存在
if (item.GetValue("Channel", null) != null)
{
channel = item.GetValue("Channel").ToString();
}
//因为是倒序的所以我取的第一条
break;
}
最后用的时候别忘了需引用: MongoDB.BSon 与 MongoDB.Driver
.Net Core如何对MongoDB执行多条件查询
以前项目基本上全部使用MySQL数据库, 最近项目排期空出了一点时间leader决定把日志模块迁移到插入/查询性能更好的MongoDB上. 多条件查询的写法着实费了些功夫, 撰文记录一下.
一、准备工作
1. 安装过程, 不赘述了
2. 添加ReferencePackage
dotnet add package mongodb.bson dotnet add package mongodb.driver
3. appsetting.json添加连接配置
"MongodbHost": { "Connection": "mongodb://[username]:[password]@[ip]:[port]", "DataBase": "[database]", "Table": "" },
4. 获取MongoDBConfig 的方法
public static MongodbHostOptions MongodbConfig() { var builder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json"); IConfiguration Configuration = builder.Build(); var option = Configuration.GetSection("MongodbHost"); return new MongodbHostOptions { Connection = option["Connection"], DataBase = option["DataBase"], Table = option["Table"] }; }
二、查询方法
这里的查询方法是网上找的, 直接拿来用了. 如果是单一数据源的话, 这里的host可以提取出来成为helper类的属性.
#region FindListByPage 分页查询集合 /// <summary> /// 分页查询集合 /// </summary> /// <param name="filter">查询条件</param> /// <param name="pageIndex">当前页</param> /// <param name="pageSize">页容量</param> /// <param name="count">总条数</param> /// <param name="field">要查询的字段,不写时查询全部</param> /// <param name="sort">要排序的字段</param> /// <returns></returns> public static List<T> FindListByPage(FilterDefinition<T> filter, int pageIndex, int pageSize, out int count, string[] field = null, SortDefinition<T> sort = null) { try { MongodbHostOptions host = Tools.AppSettingsTools.MongodbConfig(); host.Table = "WSMessageLog"; var client = MongodbClient<T>.MongodbInfoClient(host); count = Convert.ToInt32(client.CountDocuments(filter)); //不指定查询字段 if (field == null || field.Length == 0) { if (sort == null) return client.Find(filter).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); //进行排序 return client.Find(filter).Sort(sort).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); } //指定查询字段 var fieldList = new List<ProjectionDefinition<T>>(); for (int i = 0; i < field.Length; i++) { fieldList.Add(Builders<T>.Projection.Include(field[i].ToString())); } var projection = Builders<T>.Projection.Combine(fieldList); fieldList?.Clear(); //不排序 if (sort == null) return client.Find(filter).Project<T>(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); //排序查询 return client.Find(filter).Sort(sort).Project<T>(projection).Skip((pageIndex - 1) * pageSize).Limit(pageSize).ToList(); } catch (Exception ex) { throw ex; } } #endregion
三、调用查询方法
这里还踩了一个坑. MongoDB里存储的时间是格林尼治时间, 插入8:00, 查询时会发现变成了0:00,所以定义时间属性的时候需要加个标签
[BsonDateTimeOptions(Kind = DateTimeKind.Local)] public DateTime logtime { get; set; }
这里的OprLogModel是定义了查询条件的类.
public static LogPager<log_operate> Get_operate_log_mongo(OprLogModel qModel) { LogPager<log_operate> pager = new LogPager<log_operate>(); FilterDefinition<log_operate> filters; var sortbuilder = Builders<log_operate>.Sort; var sort = sortbuilder.Descending("operate_time"); #region 用户权限过滤 IEnumerable<string> IdList = dev_deviceRepository.GetBinding(qModel.user_id); filters = Builders<log_operate>.Filter.In("device_id", IdList); #endregion if (!string.IsNullOrEmpty(qModel.device_id)) { var filters_did = Builders<log_operate>.Filter.Eq("device_id", qModel.device_id); filters = Builders<log_operate>.Filter.And(filters, filters_did); } if (qModel.sDate != null) { var filters_sdate = Builders<log_operate>.Filter.Gte<DateTime>("operate_time", Convert.ToDateTime(qModel.sDate)); filters = Builders<log_operate>.Filter.And(filters, filters_sdate); } if (qModel.eDate != null) { var filters_edate = Builders<log_operate>.Filter.Lte<DateTime>("operate_time", Convert.ToDateTime(qModel.eDate)); filters = Builders<log_operate>.Filter.And(filters, filters_edate); } int total; pager.data = MongoTools<log_operate>.FindListByPage(filters, qModel.pageindex, (qModel.pageindex - 1) * qModel.pagesize, out total, null, sort); pager.total = total; return pager; } #endregion
也可以先定义一个空的filterdefinition, 然后与各查询条件通过And聚合:
FilterDefinition<log_operate> filters = FilterDefinition<log_operate>.Empty; var filters_idlist = Builders<log_operate>.Filter.In("device_id", IdList); filters = Builders<log_operate>.Filter.And(filters, filters_idlist);
以上就是.Net Core如何对MongoDB执行多条件查询的详细内容,更多关于.Net Core对MongoDB 多条件查询的资料请关注其它相关文章!
- .Net Core中使用MongoDB搭建集群与项目实战
- .Net Core使用MongoDB的详细教程
- asp.net core集成MongoDB的完整步骤
- .net Core连接MongoDB数据库的步骤详解
- MongoDB数据库介绍并用.NET Core对其进行编码
.netcore mongodb 分页+模糊查询+多条件查询
.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 - 1) * 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-1)*PageSize} };
if (sort == null)
{
if (!string.IsNullOrEmpty(req.order)) Sort = new BsonDocument { { "$sort", new BsonDocument { { req.order, 1 } } } };
}
else
{
Sort = sort;
}
if (filter != null && filter2==null)
{
var dom = filter.GetElement(0);
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};
}
}
}
c# MongoDB 分页辅助类,支持多条件查询

创建一个获取 MongoDB 数据库实例的类
public class Db
{
private static IMongoDatabase db = null;
private static readonly object lockHelper = new object();
private Db() { }
public static IMongoDatabase GetDb(string connStr, string dbName)
{
if (db == null)
{
lock (lockHelper)
{
if (db == null)
{
var client = new MongoClient(connStr);
db = client.GetDatabase(dbName);
}
}
}
return db;
}
}
创建一个操作 MongDB 的辅助类
public class MongoDbHelper<T> where T : MongoBaseEntity, new()
{
private IMongoDatabase db = null;
private IMongoCollection<T> collection = null;
private readonly IOptions<MongoDBConfig> _options;
public MongoDbHelper(IOptions<MongoDBConfig> options)
{
this._options = options;
this.db = Db.GetDb(this._options.Value.ConnectionString, this._options.Value.DbName);
this.collection = db.GetCollection<T>(typeof(T).Name);
}
/// <summary>
/// 分页
/// </summary>
/// <param name="filter"></param>
/// <param name="sort"></param>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <returns></returns>
public PagingModel<T> GetPagingData(FilterDefinition<T> filter, SortDefinition<T> sort, int pageIndex, int pageSize)
{
var list = this.collection
.Find(filter)
.Sort(sort)
.Skip((pageIndex - 1) * pageSize)
.Limit(pageSize)
.ToList();
var count = this.collection.CountDocuments(filter);
var pagingModel = new PagingModel<T>();
pagingModel.Items = list;
pagingModel.PageIndex = pageIndex;
pagingModel.PageSize = pageSize;
pagingModel.TotalRecords = Convert.ToInt32(count);
pagingModel.TotalPages = (int)Math.Ceiling((double)count / (double)pageSize);
return pagingModel;
}
}
说明:构造方法 public MongoDbHelper(IOptions<MongoDBConfig> options) 中的参数,是与配置文件中的 MongoDBConfig 节点对应的,我的项目是.net core 项目。
下面是 appsettings.json 配置文件部分代码:
"MongoDBConfig": {
"ConnectionString": "mongodb://xxx:xxx@192.168.3.240:27017",
"DbName": "xxxDB"
}
public class MongoDBConfig
{
/// <summary>
/// 数据库连接字符串
/// </summary>
public string ConnectionString { get; set; }
/// <summary>
/// 具体数据库名称
/// </summary>
public string DbName { get; set; }
}
创建一个分页实体类
/// <summary>
/// 描述:分页实体
/// 创建人:苏本东
/// 创建时间:2019-3-5 19:05:20
/// </summary>
/// <typeparam name="T"></typeparam>
public class PagingModel<T> where T : class, new()
{
/// <summary>
/// 当前页码
/// </summary>
public int PageIndex { get; set; }
/// <summary>
/// 每页大小
/// </summary>
public int PageSize { get; set; }
/// <summary>
/// 总记录数
/// </summary>
public int TotalRecords { get; set; }
/// <summary>
/// 总页数
/// </summary>
public int TotalPages { get; set; }
/// <summary>
/// 每页数据
/// </summary>
public List<T> Items { get; set; }
}
最后就是调用了
FilterDefinition<ModbusData> filter = Builders<ModbusData>.Filter.Empty;
if (request.Ip.IsNotNullAndEmpty())
{
//注意:Eq方法的第一个参数,大小写需要跟数据库一致,不然查询无效
filter = Builders<ModbusData>.Filter.Eq("IP", request.Ip);
}
var sort = Builders<ModbusData>.Sort.Descending(c => c._id);
var pagingModel = this._mongo.GetPagingData(filter,
sort,
(int)request.page,
(int)request.limit);
ModbusData 类是与 MongoDB 的表对应的
提供两篇文章供学习参考:
https://www.cnblogs.com/quebra/p/10202449.html
https://www.cnblogs.com/woxpp/p/6347429.html
今天关于.Net Core对MongoDB执行多条件查询和.net core mongodb的介绍到此结束,谢谢您的阅读,有关.Net core---- 使用 Mongo 多条件查询、.Net Core如何对MongoDB执行多条件查询、.netcore mongodb 分页+模糊查询+多条件查询、c# MongoDB 分页辅助类,支持多条件查询等更多相关知识的信息可以在本站进行查询。
本文标签: