ToB企服应用市场:ToB评测及商务社交产业平台

标题: 通用的CRUD之MongoDB [打印本页]

作者: 飞不高    时间: 2023-7-9 13:56
标题: 通用的CRUD之MongoDB
前言

这是一个简便的,对MongoDB增删改查,无需提前建库,建表,安装就能快速上手使用。
MongoDB多条件查询需要JSON的多层嵌套如{DDATE:{$gte:{$date:'2023-06-05T13:41'},$lte:{$date:'2023-06-05T23:59'}},Qty:{$gt:10}},书写时非常难受,还容易出错。
本类库支持类SQL查询语法,如"DDATE>='2023-06-05 09:12:24' and DDATE10",同时也支持原生查询语法。
安装

Install-Package DbCRUD.LiteDB 安装包
数据库连接及初始化 Database connection and initialization
  1. //数据库连接 Database connection
  2.   IDbCRUD testdb =new MongoDbCRUD("mongodb://localhost:27017/testdb");
  3. //带连接选项初始化数据库连接对象
  4.   MongoDbCRUD testdb = new MongoDbCRUD("mongodb://localhost:27017/testdb", opt => { opt.AutoCreateIndex = true;opt.AutoOpen = true; });
复制代码
插入数据 Insert data
  1. //*****插入对象数据 Insert object data synchronously
  2. int id = testdb.Max<int>(tb_custormer);
  3. var customer = new CrudTestModel
  4. {
  5.     ID = id + 1,
  6.     Name = "objectData",
  7.     Phones = new string[] { "80000", "90000" },
  8.     FFloat=random.NextDouble(),
  9.     IsActive = true,
  10.     Dic = new Dictionary<string, object>
  11.     {
  12.         { "Name", "Embed_Data" },
  13.         { "DDate", DateTime.Now }
  14.     }
  15. };
  16. var result = testdb.Insert(tb_custormer, customer);
  17. //*****插入字典数据 Insert dictionary data synchronously
  18. var dic1 = new Dictionary<string, object>
  19. {
  20.     //{ "_id", 1 },//***如果不指定ID,插入时会自动编一个objectid的唯一ID
  21.     { "Name", "MongodbCRUD" },
  22.     { "Qty",random.Next(1,10000) },
  23.     { "DDATE", DateTime.Now }
  24. };
  25. var dicresult = testdb.Insert(autoIDData, dic1);
  26. //*****插入JSON数据 Insert JSON data
  27. string jsondata = JsonConvert.SerializeObject(dic1);
  28. var result12 =testdb.Insert(tb_jsondata, jsondata);
  29. //*****SQL语句插入 sql command insert 大小写敏感
  30. var result13 = testdb.Insert($"insert into {sqldata}('name','date') values ('test1','{DateTime.Now.ToString("yyyy-MM-dd HH:mm:dd")}')");
  31. //*****批量插入列表 Batch insert
  32. List<Dictionary<string, object>> listdata = new List<Dictionary<string, object>>();
  33. int maxid = testdb.Max<int>(dictable);
  34. for (int i = 0; i < 10; i++)
  35. {
  36.     maxid++;
  37.     var dic2 = new Dictionary<string, object>
  38.     {
  39.         { "_id",maxid },
  40.         { "Name", "Batch insert" },
  41.         { "Qty",random.Next(1,10000) },
  42.         { "DDATE", DateTime.Now }
  43.     };
  44.     listdata.Add(dic2);
  45. }
  46. var listResult= testdb.Insert(dictable, listdata);
复制代码

更新数据 update data
  1.     var updata = new Dictionary<string, object>
  2.     {
  3.         { "Name", "更新指定字段数据 Updates the specified field data" },
  4.         { "Qty", 600}
  5.     };
  6.     var upresult = testdb.UpDate(dictable, updata, "_id=6");   //更新_id=2的数据
  7.     //【SQL语句更新】 更新_id=1的数据 ,mongodb对大小写敏感,所有sql语句中的表名和字段名大小写要与DB一致。
  8.     var sql_up_result = testdb.UpDate("UPDATE dicdata SET Name='zzw',Qty=188 where _id=1");  
复制代码
更新及插入数据(数据存在更新,不存在插入) Update and insert data (there is an update of the data, but there is no insertion)
  1.     //***** 更新或插入数据 Update or insert data
  2.     var dic1 = new Dictionary<string, object>
  3.     {
  4.         { "_id", 2 },
  5.         { "Name", "Inserts or updates a single piece of data" },
  6.         { "Qty", 200},
  7.         { "DDATE", DateTime.Now }
  8.     };
  9.     var result= testdb.Upsert(dictable, dic1);
  10.    //*****Batch insert or update Batch insert or update
  11.     var dic3 = new Dictionary<string, object>
  12.     {
  13.         { "_id", 3 },
  14.         { "Name", "Batch insert or update" },
  15.         { "Qty", 300},
  16.         { "DDATE", DateTime.Now }
  17.     };
  18.     List<Dictionary<string,object>> listdata=new List<Dictionary<string, object>> { dic3,dic1};
  19.     var listresult = testdb.Upsert(dictable, listdata);
  20.    //*****不存在就插入 Insert if it doesn't exist
  21.     int maxid = testdb.Max<int>(dictable)+1;
  22.     var dic4 = new Dictionary<string, object>
  23.     {
  24.         { "_id", maxid },
  25.         { "Name", "根据_id不存在插入值" },
  26.         { "Qty", 8000},
  27.         { "DDATE", DateTime.Now }
  28.     };
  29.     testdb.Upsert(dictable, dic4);
复制代码
查询数据 Query data
  1.    ///查找id=2的数据
  2.     var databyid = testdb.FindByID<Dictionary<string, object>>(dictable, 2);
  3.     //查找id=2的数据,返回模型数据。
  4.     //【注意】模型和数据库中的列数不一致时,需要在模型上加 [BsonIgnoreExtraElements]特性,
  5.     //        mongodb默认时UTC时间,如果要转本地时间,在模型时间属性上加[BsonDateTimeOptions(Kind =DateTimeKind.Local)]特性
  6.     var modeldata = testdb.Find<CrudTestModel1>(tb_custormer, "_id=2")?.FirstOrDefault();
  7.     ///查找id>2的数据,返回按DDATE排序,并排除dic列的最新一条数据
  8.     var ondresult = testdb.FindOne<CrudTestModel>(tb_custormer, "_id>2", project: "!dic", sort: "!DDATE");
  9.     //查找Qty>10的数据
  10.     var wheredata = testdb.Find<Dictionary<string, object>>(dictable, "Qty>10");
  11.    
  12.     //【SQL语法,查找开头】,查找name中'Mongodbi'开头的数据,条件不区分大小写,字段名称区分大小写
  13.     var like_result = testdb.FindAndResult<Dictionary<string, object>>(autoIDData, "Name like'Mongodb%'");
  14.     //【SQL语法,查找结尾】,查找name中'crud'开头的数据,条件不区分大小写,字段名称区分大小写
  15.     var like_result1 = testdb.FindAndResult<Dictionary<string, object>>(autoIDData, "Name like'%crud'");
  16.     //【SQL语法,包含】,查找name中包含'odb'的数据,条件不区分大小写,字段名称区分大小写
  17.     var like_result2 = testdb.FindAndResult<Dictionary<string, object>>(autoIDData, "Name like'%odb%'");
  18.    
  19.     //【MongoDB语法】,查找name中'Mongodbi'开头的数据,不区分大小写
  20.     var bsonwheredata = testdb.Find<Dictionary<string, object>>(autoIDData, "{Name:/^Mongodb/i}");
  21.    
  22.     //****SQL语法和Mongodb查询语法不能混用,简单查询使用SQL语法,书写简单,复杂查询只能使用原生语法。
  23.     //【简写语法】分页查找Qty>10,返回除_id列,按DDATE倒序排序的数据,返回第一页10条数据。
  24.     var pagedata = testdb.GetPagingData<Dictionary<string, object>>(tb_jsondata, "Qty>10",project:"!_id",sort: "!DDATE", pageindex: 1, pagecount: 10);
  25.    
  26.     //【Mongodb语法】分页查找Qty>10,返回除_id列,按DDATE倒序排序的数据,返回第一页10条数据。
  27.     var mgdb_pagedata = testdb.GetPagingData<Dictionary<string, object>>(tb_jsondata, "{Qty:{$gt:10}}", project: "{_id:0}", sort: "{DDATE:-1}", pageindex: 1, pagecount: 10);
  28.    
  29.     //【返回DataTable】分页查找Qty>10,返回除_id列,按DDATE倒序排序的数据,返回第一页10条数据。
  30.     var datatable_pagedata = testdb.GetPagingData(autoIDData, "Qty>10", project: "!_id", sort: "!DDATE", pageindex: 1, pagecount: 10);
  31.    
  32.     //【多条件查询】分页查找Qty>10,返回除_id列,按DDATE倒序排序的数据,返回第一页10条数据。
  33.     var mu_where = testdb.GetPagingData<Dictionary<string, object>>(dictable, "_id>=6 and Qty>10", sort: "!DDATE", pageindex: 1, pagecount: 10);
  34.    
  35.     //【日期范围查询】查找DDATE>='2023-06-05 09:12:24' 和 DDATE<='2023-06-05 13:28:48'的数据。
  36.     var date_result = testdb.GetPagingDataAndResult<Dictionary<string, object>>(dictable, "DDATE>='2023-06-05 09:12:24' and DDATE<='2023-06-05 13:28:48'", sort: "!DDATE", pageindex: 1, pagecount: 10);
  37.    
  38.     //【in查询】查找Qty=200和300的数据。
  39.     var in_result = testdb.GetPagingDataAndResult<Dictionary<string, object>>(dictable, "Qty in(200,300)", sort: "!DDATE", pageindex: 1, pagecount: 10);
  40.    
  41.     //【in模糊查询】查找Name=Batch insert和data结尾的数据。
  42.     var in_fuzzy = testdb.GetPagingDataAndResult<Dictionary<string, object>>(dictable, "Name in('Batch insert','%data')", sort: "!DDATE", pageindex: 1, pagecount: 10);
  43.     //【正则表达式查询】查找Name=Batch开头的数据。
  44.     var in_regex = testdb.GetPagingDataAndResult<Dictionary<string, object>>(dictable, "Name reg'^Batch'", sort: "!DDATE", pageindex: 1, pagecount: 10);s
  45.     //【sql语句查询】查找_id=1的数据
  46.     string sqlcmd = $"select _id,Name,DDATE from {dictable} where _id=1";
  47.     var sqldata = testdb.Find<Dictionary<string, object>>(sqlcmd);
  48.     //【委托查询】查找_id>=6 and Qty>10的数据。数据在委托中返回,方便进行数据处理
  49.     var action_result = testdb.GetPagingDataAction<CrudTestModel1>(dictable, "_id>=6 and Qty>10", datalist =>
  50.     {
  51.         double sum = datalist.Sum(s => s.FFloat);
  52.                
  53.     });
复制代码
删除数据 delete data
  1.     //**删除ID=8的数据
  2.     var result = testdb.Delete(dictable, 8);
  3.     //**删除qty>10的数据
  4.      var wherresult = testdb.Delete(dictable, "_id>=10");
  5.     //**使用sql语句删除ID = 7的数据,大小写敏感
  6.     string sql = $"delete from {dictable} where _id=7";
  7.     var sqlresult = testdb.Delete(sql);
复制代码
消息事件绑定(可日志输出)
  1.     public DbTest() {
  2.     t estdb.Message += Testdb_Message;
  3.     }
  4.     private void Testdb_Message((string Message, string Level, DateTime Time) obj)
  5.     {
  6.        Debug.WriteLine($"{obj.Time}|{obj.Level}|{obj.Message}");
  7.     }
复制代码
增删改查系列包

<ul>
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4