www.91084.com

GVKun编程网logo

.Net Core对MongoDB执行多条件查询(.net core mongodb)

9

本文将带您了解关于.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对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 多条件查询

.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执行多条件查询

.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 分页+模糊查询+多条件查询

.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 分页辅助类,支持多条件查询

c# MongoDB 分页辅助类,支持多条件查询

OSC 请你来轰趴啦!1028 苏州源创会,一起寻宝 AI 时代

创建一个获取 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 分页辅助类,支持多条件查询等更多相关知识的信息可以在本站进行查询。

本文标签: