十年河東,十年河西,莫欺少年窮
學無止境,精益求精
傳統的關系數據庫一般由數據庫(database)、表(table)、記錄(record)三個層次概念組成,MongoDB是由數據庫(database)、集合(collection)、文檔對象(document)三個層次組成。MongoDB對於關系型數據庫里的表,但是集合中沒有列、行和關系概念,這體現了模式自由的特點。
那么在c#如何使用呢?下面看個例子,你會發現上手非常簡單。
1、新建一個NetCore控制台應用程序
然后Nuget引用,如下:
Install-Package MongoDB.Driver -Version 2.11.0
Install-Package MongoDB.Bson -Version 2.11.0
然后,新建一個MongoDb的操作類【此操作類用於創建數據庫、表,批量插入,查詢全部數據等】

using MongoDB.Driver; using System; using System.Collections.Generic; using System.Text; namespace ConsoleMongoDb.Helper { /// <summary> /// 這里的T 代表數據表的Model /// </summary> /// <typeparam name="T"></typeparam> public class MongoHelper<T> { public readonly IMongoCollection<T> MongoTb; public MongoHelper(DatabaseSettings settings) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); MongoTb = database.GetCollection<T>(settings.LogsCollectionName); } /// <summary> /// 單條插入 /// </summary> /// <param name="book"></param> /// <returns></returns> public T Create(T book) { MongoTb.InsertOne(book); return book; } /// <summary> /// 批量插入 /// </summary> /// <param name="books"></param> /// <returns></returns> public List<T> Create(List<T> books) { MongoTb.InsertMany(books); return books; } /// <summary> /// 批量查詢所有 /// </summary> /// <returns></returns> public List<T> Get() { return MongoTb.Find(book => true).ToList(); } } public class DatabaseSettings { public string LogsCollectionName { get; set; } = "TableName";//日志 public string ConnectionString { get; set; } = "mongodb://127.0.0.1:27017";//連接字符串 public string DatabaseName { get; set; } = "DbName"; } }
在上述的操作類中,由注釋可知,<T> 代表mongoDB的表對象,那么下面我們創建一張mongoDB的表對象【學生表】,如下:

using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using System; using System.Collections.Generic; using System.Text; namespace ConsoleMongoDb.MongoModel { /// <summary> /// mongoDb數據表實體 /// </summary> public class Student { [BsonId] [BsonRepresentation(BsonType.ObjectId)] public string Id { get; set; } [BsonElement("StudentName")] public string StudentName { get; set; } public string StudentSex { get; set; } public DateTime CreateDate { get; set; } } }
為了演示大數據,我們引入一個隨機生成姓名的類,如下:

using System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Threading.Tasks; using System.Web; namespace ConsoleMongoDb.Helper { public class connonName { private object O = new object(); public static List<string> Xing = new List<string>() {"趙", "錢", "孫", "李", "周", "吳", "鄭", "王", "馮", "陳", "楮", "衛", "蔣", "沈", "韓", "楊", "朱", "秦", "尤", "許", "何", "呂", "施", "張", "孔", "曹", "嚴", "華", "金", "魏", "陶", "姜", "戚", "謝", "鄒", "喻", "柏", "水", "竇", "章", "雲", "蘇", "潘", "葛", "奚", "范", "彭", "郎", "魯", "韋", "昌", "馬", "苗", "鳳", "花", "方", "俞", "任", "袁", "柳", "酆", "鮑", "史", "唐", "費", "廉", "岑", "薛", "雷", "賀", "倪", "湯", "滕", "殷", "羅", "畢", "郝", "鄔", "安", "常", "樂", "於", "時", "傅", "皮", "卞", "齊", "康", "伍", "余", "元", "卜", "顧", "孟", "平", "黃", "和", "穆", "蕭", "尹", "姚", "邵", "湛", "汪", "祁", "毛", "禹", "狄", "米", "貝", "明", "臧", "計", "伏", "成", "戴", "談", "宋", "茅", "龐", "熊", "紀", "舒", "屈", "項", "祝", "董", "梁", "杜", "阮", "藍", "閩", "席", "季", "麻", "強", "賈", "路", "婁", "危", "江", "童", "顏", "郭", "梅", "盛", "林", "刁", "鍾", "徐", "丘", "駱", "高", "夏", "蔡", "田", "樊", "胡", "凌", "霍", "虞", "萬", "支", "柯", "昝", "管", "盧", "莫", "經", "房", "裘", "繆", "干", "解", "應", "宗", "丁", "宣", "賁", "鄧", "郁", "單", "杭", "洪", "包", "諸", "左", "石", "崔", "吉", "鈕", "龔", "程", "嵇", "邢", "滑", "裴", "陸", "榮", "翁", "荀", "羊", "於", "惠", "甄", "麹", "家", "封", "芮", "羿", "儲", "靳", "汲", "邴", "糜", "松", "井", "段", "富", "巫", "烏", "焦", "巴", "弓", "牧", "隗", "山", "谷", "車", "侯", "宓", "蓬", "全", "郗", "班", "仰", "秋", "仲", "伊", "宮", "寧", "仇", "欒", "暴", "甘", "斜", "厲", "戎", "祖", "武", "符", "劉", "景", "詹", "束", "龍", "葉", "幸", "司", "韶", "郜", "黎", "薊", "薄", "印", "宿", "白", "懷", "蒲", "邰", "從", "鄂", "索", "咸", "籍", "賴", "卓", "藺", "屠", "蒙", "池", "喬", "陰", "郁", "胥", "能", "蒼", "雙", "聞", "莘", "黨", "翟", "譚", "貢", "勞", "逄", "姬", "申", "扶", "堵", "冉", "宰", "酈", "雍", "郤", "璩", "桑", "桂", "濮", "牛", "壽", "通", "邊", "扈", "燕", "冀", "郟", "浦", "尚", "農", "溫", "別", "庄", "晏", "柴", "瞿", "閻", "充", "慕", "連", "茹", "習", "宦", "艾", "魚", "容", "向", "古", "易", "慎", "戈", "廖", "庾", "終", "暨", "居", "衡", "步", "都", "耿", "滿", "弘", "匡", "國", "文", "寇", "廣", "祿", "闕", "東", "歐", "殳", "沃", "利", "蔚", "越", "夔", "隆", "師", "鞏", "厙", "聶", "晁", "勾", "敖", "融", "冷", "訾", "辛", "闞", "那", "簡", "饒", "空", "曾", "毋", "沙", "乜", "養", "鞠", "須", "豐", "巢", "關", "蒯", "相", "查", "后", "荊", "紅", "游", "竺", "權", "逑", "蓋", "益", "桓", "公", "仉", "督", "晉", "楚", "閻", "法", "汝", "鄢", "塗", "欽", "岳", "帥", "緱", "亢", "況", "后", "有", "琴", "歸", "海", "墨", "哈", "譙", "笪", "年", "愛", "陽", "佟", "商", "牟", "佘", "佴", "伯", "賞", "萬俟", "司馬", "上官", "歐陽", "夏侯", "諸葛", "聞人", "東方", "赫連", "皇甫", "尉遲", "公羊", "澹台", "公冶", "宗政", "濮陽", "淳於", "單於", "太叔", "申屠", "公孫", "仲孫", "軒轅", "令狐", "鍾離", "宇文", "長孫", "慕容", "鮮於", "閭丘", "司徒", "司空", "丌官", "司寇", "子車", "微生", "顓孫", "端木", "巫馬", "公西", "漆雕", "樂正", "壤駟", "公良", "拓拔", "夾谷", "宰父", "谷梁", "段干", "百里", "東郭", "南門", "呼延", "羊舌", "梁丘", "左丘", "東門", "西門", "南宮"}; static string _lastNameMan = "剛偉勇毅俊峰強軍平保東文輝力明永健世廣志義興良海山仁波寧貴福生龍元全國勝學祥才發武新利清飛彬富順信子傑濤昌成康星光天達安岩中茂進林有堅和彪博誠先敬震振壯會思群豪心邦承樂紹功松善厚慶磊民友裕河哲江超浩亮政謙亨奇固之輪翰朗伯宏言若鳴朋斌梁棟維啟克倫翔旭鵬澤晨辰士以建家致樹炎德行時泰盛雄琛鈞冠策騰楠榕風航弘"; static string _lastNameWoMan = "秀娟英華慧巧美娜靜淑惠珠翠雅芝玉萍紅娥玲芬芳燕彩春菊蘭鳳潔梅琳素雲蓮真環雪榮愛妹霞香月鶯媛艷瑞凡佳嘉瓊勤珍貞莉桂娣葉璧璐婭琦晶妍茜秋珊莎錦黛青倩婷姣婉嫻瑾穎露瑤怡嬋雁蓓紈儀荷丹蓉眉君琴蕊薇菁夢嵐苑婕馨瑗琰韻融園藝詠卿聰瀾純毓悅昭冰爽琬茗羽希寧欣飄育瀅馥筠柔竹靄凝魚曉歡霄楓芸菲寒伊亞宜可姬舒影荔枝思麗墨"; public static List<string> GetManName() { Stopwatch sw = new Stopwatch(); sw.Start(); List<string> NameArray = new List<string>(); int XingLen = Xing.Count;//501個姓 char[] ManChar = _lastNameMan.ToCharArray();//151的男士名 char[] WoManChar = _lastNameWoMan.ToCharArray();//151個女士名 int ManNameLen = ManChar.Length;//151的男士名 int WoManNameLen = WoManChar.Length;//151個女士名 // foreach (var item in Xing) { foreach (var Ming in ManChar) { NameArray.Add(item + Ming); } } foreach (var item in Xing) { foreach (var Ming in WoManChar) { NameArray.Add(item + Ming); } } sw.Stop(); TimeSpan ts2 = sw.Elapsed; Console.WriteLine("Parallel.ForEach總共花費{0}ms.", ts2.TotalMilliseconds); return NameArray; } } }
然后客戶端方法為:

using ConsoleMongoDb.Helper; using ConsoleMongoDb.MongoModel; using System; using System.Collections.Concurrent; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace ConsoleMongoDb { class Program { /// <summary> /// mongoDb會自動判斷數據庫、數據表是否存在,如果不存在,則創建 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Console.WriteLine("現在開始創建數據庫,數據表,並插入大量數據"); //創建一個StudentDb數據庫,並指定一張待建的表Student,采用默認連接方式,如果不同,請修改 DatabaseSettings ds = new DatabaseSettings() { DatabaseName = "StudentDb",//數據庫名 LogsCollectionName = "Student"//表名 }; MongoHelper<Student> mongo = new MongoHelper<Student>(ds); List<string> NameArray = connonName.GetManName(); List<Student> Lst = new List<Student>(); for (int i=0;i< NameArray.Count; i++) { var student = new Student() { StudentName = NameArray[i], CreateDate = DateTime.Now, StudentSex = (i % 2 == 0 ? "男" : "女") }; Lst.Add(student); } //批量插入mongodb mongo.Create(Lst); Console.WriteLine("插入數據完畢"); Console.Read(); } } }
事實證明:
mongoDb果然不是蓋的,通過上述的程序,一共插入了十幾萬條數據,總花費大概不到二秒鍾,牛逼吧。
那么,現在我們有了這么十幾萬條數據,我們就可以安心的進行分頁處理了,那么mongodb中分頁怎么搞呢?
首先創建基本的分頁類

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace ConsoleMongoDb.Helper { public static class MongoPaginationService { /// <summary> /// 分頁 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="entitys"></param> /// <param name="json"></param> /// <param name="pagination"></param> /// <returns></returns> public static IQueryable<T> BasePager<T>(this IOrderedQueryable<T> entitys, ref BasePaginationModel pagination) { if (pagination != null) { var result = entitys.GetBasePagination(pagination); return result; } return null; } /// <summary> /// 獲取分頁后的數據 /// </summary> /// <typeparam name="T">實體類型</typeparam> /// <param name="source">數據源IQueryable</param> /// <param name="pagination">分頁參數</param> /// <returns></returns> private static IQueryable<T> GetBasePagination<T>(this IOrderedQueryable<T> source, BasePaginationModel pagination) { pagination.Total = source.Count(); return source.Skip((pagination.PageNumber - 1) * pagination.PageSize).Take(pagination.PageSize); } } public class PaginationListModel<T> { public PaginationListModel() { Data = new List<T>(); } public List<T> Data { get; set; } public BasePaginationModel Pagination { get; set; } } public class PaginationModel { #region 構造函數 public PaginationModel() { PageNumber = 1; PageSize = 10; } #endregion /// <summary> /// 當前頁碼 /// </summary> public int PageNumber { get; set; } /// <summary> /// 每頁行數 /// </summary> public int PageSize { get; set; } } /// <summary> /// 基本分頁實體類 /// </summary> public class BasePaginationModel { #region 構造函數 public BasePaginationModel() { PageNumber = 1; PageSize = 10; } #endregion #region 成員 /// <summary> /// 總頁數 /// </summary> public int PageCount { get { int pages = Total / PageSize; int pageCount = Total % PageSize == 0 ? pages : pages + 1; return pageCount; } } /// <summary> /// 當前頁碼 /// </summary> public int PageNumber { get; set; } /// <summary> /// 每頁行數 /// </summary> public int PageSize { get; set; } /// <summary> /// 總記錄數 /// </summary> public int Total { get; set; } /// <summary> /// 總頁數 /// </summary> public int Pages { get => PageCount; } /// <summary> /// 是否首頁 /// </summary> public bool IsFirstPage { get => PageNumber == 1; } /// <summary> /// 是否尾頁 /// </summary> public bool IsLastPage { get => PageNumber == Pages; } #endregion } }
然后我的分頁方法為:
static PaginationListModel<Student> GetPagination(DatabaseSettings settings,ref BasePaginationModel Pagination) { var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); var Mongo = database.GetCollection<Student>(settings.LogsCollectionName); var mongorResult = Mongo.AsQueryable<Student>().Where(A => !string.IsNullOrEmpty(A.StudentName)).OrderByDescending(item => item.CreateDate); var result = MongoPaginationService.BasePager<Student>(mongorResult, ref Pagination); PaginationListModel<Student> M = new PaginationListModel<Student>() { Data = result.ToList(), Pagination = Pagination }; return M; }
客戶端代碼為:
/// <summary> /// mongoDb會自動判斷數據庫、數據表是否存在,如果不存在,則創建 /// </summary> /// <param name="args"></param> static void Main(string[] args) { Console.WriteLine("現在開始創建數據庫,數據表,並插入大量數據"); //創建一個StudentDb數據庫,並指定一張待建的表Student,采用默認連接方式,如果不同,請修改 DatabaseSettings ds = new DatabaseSettings() { DatabaseName = "StudentDb",//數據庫名 LogsCollectionName = "Student"//表名 }; MongoHelper<Student> mongo = new MongoHelper<Student>(ds); List<string> NameArray = connonName.GetManName(); List<Student> Lst = new List<Student>(); for (int i=0;i< NameArray.Count; i++) { var student = new Student() { StudentName = NameArray[i], CreateDate = DateTime.Now, StudentSex = (i % 2 == 0 ? "男" : "女") }; Lst.Add(student); } //批量插入mongodb mongo.Create(Lst); Console.WriteLine("插入數據完畢"); //查詢並分頁 BasePaginationModel pagination = new BasePaginationModel() { PageNumber = 1, PageSize = 100 }; var RT = GetPagination(ds, ref pagination); Console.WriteLine("當前頁碼為1,也容量為100,總共有" + RT.Pagination.Total + "條數據,總共分了" + RT.Pagination.PageCount + "頁。"); Console.WriteLine("查詢結果為:"); foreach(var item in RT.Data) { Console.WriteLine("學生:" + item.StudentName); } Console.Read(); }
OK,我們看下輸出的結果:
可以看到,總共30多萬條數據,分了3027頁,每頁100條數據【每運行一次,就會插入十幾萬條數據,因此,目前是30多萬條數據】。
以上便是我的分頁。
擴展:
如何刪除數據表數據庫呢?
static void Main(string[] args) { DatabaseSettings ds = new DatabaseSettings() { DatabaseName = "StudentDb",//數據庫名 LogsCollectionName = "Student"//表名 }; //執行刪除數據庫操作 var client = new MongoClient(ds.ConnectionString); var database = client.GetDatabase(ds.DatabaseName); database.DropCollection("Student");//刪除數據表 Console.WriteLine("學生表刪除成功"); database.Client.DropDatabase("StudentDb"); Console.WriteLine("數據庫刪除成功"); Console.Read(); }
OK,就這么多吧。
關於多條件關聯查詢,MongoDb有自己的一套東東,反正用起來不是那么友好...
如下:

/// <summary> /// 查詢MongoDb 電櫃門狀態 帶有分頁 /// </summary> /// <returns></returns> public BaseResponse<PaginationListModel<LogsForcloud181DgTb>> QueryDoorStatus(QueryDoorStatusModel data, ref BasePaginationModel Pagination) { string DbName = "LogstoreDb" + "_" + data.SDate.ToString("yyyyMMdd"); LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.MongoDbnameEnm.DevicePortStatus.ToString(), DatabaseName = DbName }; var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(settings.DatabaseName); var Mongo = database.GetCollection<LogsForcloud181DgTb>(settings.LogsCollectionName); //IAsyncCursor<LogsForcloud181DgTb> Tb = null; List<FilterDefinition<LogsForcloud181DgTb>> SearchList=new List<FilterDefinition<LogsForcloud181DgTb>>(); var builder = Builders<LogsForcloud181DgTb>.Filter; if (!string.IsNullOrEmpty(data.deviceNum)) { //等於 var filter = builder.Eq("deviceNum", data.deviceNum); SearchList.Add(filter); //Tb = Mongo.Find<LogsForcloud181DgTb>(filter).ToCursor(); } if (data.BeginDate.HasValue) { var bDate = Convert.ToDateTime(data.BeginDate).AddHours(-8); //約束條件 DateTime startTime = new DateTime(bDate.Year, bDate.Month, bDate.Day, bDate.Hour, bDate.Minute, bDate.Second, DateTimeKind.Utc); //大於等於 var filter = builder.Gte("CreateTime", startTime); SearchList.Add(filter); } if (data.EndDate.HasValue) { var eDate = Convert.ToDateTime(data.EndDate).AddHours(-8); //約束條件 DateTime endTime = new DateTime(eDate.Year, eDate.Month, eDate.Day, eDate.Hour, eDate.Minute, eDate.Second, DateTimeKind.Utc); //小於等於 var filter = builder.Lte("CreateTime", endTime); SearchList.Add(filter); } var MongoR = Mongo.Find(Builders<LogsForcloud181DgTb>.Filter.And(SearchList)).ToList(); var mongorResult = MongoR.AsQueryable<LogsForcloud181DgTb>().Where(A => A.deviceNum == data.deviceNum).OrderByDescending(item => item.CreateTime); ; var result = MongoPaginationService.BasePager<LogsForcloud181DgTb>(mongorResult, ref Pagination); PaginationListModel<LogsForcloud181DgTb> M = new PaginationListModel<LogsForcloud181DgTb>() { Data = result.ToList(), Pagination = Pagination }; return CommonBaseResponse.SetResponse<PaginationListModel<LogsForcloud181DgTb>>(M, true); }
MongoDB更新如下:

private static object oo = new object(); /// <summary> /// 設備的固定上傳信息--.倉位狀態上報--30秒心跳包 /// </summary> /// <param name="data"></param> public void devicePingToCloudToDb(string data) { lock (oo) { var model = Newtonsoft.Json.JsonConvert.DeserializeObject<WA_RequestBase<List<WA_CangweiZtResult>>>(data); if (model.dat != null && model.dat.Count > 0) { LogstoreDatabaseSettings st = new LogstoreDatabaseSettings() { LogsCollectionName = "WA_" + CommEnum.MongoDbnameEnm.DevicePortStatus.ToString() }; var Model = new WA_DevicePortStatusTodb { CreateTime = DateTime.Now, cmd = model.cmd, deviceNum = model.id, dr = model.dat[0].dr, ds = model.dat[0].ds, btinfo = model.dat[0].btinfo, dt = model.dat[0].dt, //data = data }; if (!string.IsNullOrEmpty(Model.btinfo)) { btinfoModel TbModel = new btinfoModel(Model.btinfo); // Model.batteryType = 0; Model.voltage = TbModel.Voltage; Model.scale = TbModel.SOC; Model.capacity = TbModel.Caption; Model.batterySN = TbModel.BettaryNum; Model.TotalVoltage = TbModel.TotalVoltage; Model.Electric = TbModel.Electric; Model.BettaryStatus = TbModel.BettaryStatus; Model.BettaryStatusString = TbModel.BettaryStatusString; Model.MOS = TbModel.MOS; Model.MOSEjz = TbModel.MOSEjz; Model.MOSEjzString = TbModel.MOSEjzString; Model.ljfdrl = TbModel.ljfdrl; Model.ljcdrl = TbModel.ljcdrl; Model.softVersion = TbModel.softVersion; Model.heardWareVersion = TbModel.heardWareVersion; Model.MaxSigVoltage = TbModel.MaxSigVoltage; Model.MinSigVoltage = TbModel.MinSigVoltage; Model.MaxTemperature = TbModel.MaxTemperature; Model.MinTemperature = TbModel.MinTemperature; Model.VoltageNum = TbModel.VoltageNum; Model.SigVoltage = TbModel.SigVoltage; Model.TemperatureNum = TbModel.TemperatureNum; Model.SigTemperature = TbModel.SigTemperature; Model.Mos_1 = TbModel.Mos_1; Model.Mos_2 = TbModel.Mos_2; Model.Police = TbModel.Police; Model.PoliceEjz = TbModel.PoliceEjz; Model.PoliceEjzString = TbModel.PoliceEjzString; Model.ljqcbcs = TbModel.ljqcbcs; Model.ljcdcs = TbModel.ljcdcs; Model.cdqcdcs = TbModel.cdqcdcs; Model.dgcdcs = TbModel.dgcdcs; Model.ggStatus = TbModel.ggStatus; // } new MongoLogService<WA_DevicePortStatusTodb>(st).Create(Model); //上為插入,下為更新 //存在則更新 不存在,則插入 LogstoreDatabaseSettings st_now = new LogstoreDatabaseSettings() { LogsCollectionName = "WA_" + CommEnum.MongoDbnameEnm.DevicePortNowStatus.ToString() }; var client = new MongoClient(st_now.ConnectionString); var database = client.GetDatabase(st_now.DatabaseName); var Mongo = database.GetCollection<WA_DeviceNowStatusTodb>(st_now.LogsCollectionName); var builder = Builders<WA_DeviceNowStatusTodb>.Filter; var filter = builder.And(builder.Eq("deviceNum", Model.deviceNum), builder.Eq("dr", Model.dr)); var MongoEntity = Mongo.Find(filter).FirstOrDefault(); if (MongoEntity == null) { var Model2 = new WA_DeviceNowStatusTodb { CreateTime = DateTime.Now, cmd = model.cmd, deviceNum = model.id, dr = model.dat[0].dr, ds = model.dat[0].ds, dt = model.dat[0].dt, }; if (!string.IsNullOrEmpty(Model.btinfo)) { btinfoModel TbModel = new btinfoModel(Model.btinfo); Model2.batteryType = 0; Model2.voltage = TbModel.Voltage; Model2.scale = TbModel.SOC; Model2.capacity = TbModel.Caption; Model2.batterySN = TbModel.BettaryNum; Model2.TotalVoltage = TbModel.TotalVoltage; Model2.Electric = TbModel.Electric; Model2.BettaryStatus = TbModel.BettaryStatus; Model2.BettaryStatusString = TbModel.BettaryStatusString; } new MongoLogService<WA_DeviceNowStatusTodb>(st_now).Create(Model2); } else { if (!string.IsNullOrEmpty(Model.btinfo)) { var update = Builders<WA_DeviceNowStatusTodb>.Update.Set("deviceNum", Model.deviceNum).Set("dr", Model.dr).Set("ds", Model.ds).Set("dt", Model.dt).Set("batteryType", Model.batteryType).Set("voltage", Model.voltage).Set("scale", Model.scale).Set("capacity", Model.capacity).Set("batterySN", Model.batterySN).Set("TotalVoltage", Model.TotalVoltage).Set("Electric", Model.Electric).Set("BettaryStatus", Model.BettaryStatus).Set("BettaryStatusString", Model.BettaryStatusString).Set("CreateTime", Model.CreateTime); Mongo.UpdateMany(filter, update); } } } } //30秒心跳更新 新增到數據庫 //Task.Run(delegate { DevicePortStatusToSql(model);}); }
主要代碼:
//存在則更新 不存在,則插入 LogstoreDatabaseSettings st_now = new LogstoreDatabaseSettings() { LogsCollectionName = "WA_" + CommEnum.MongoDbnameEnm.DevicePortNowStatus.ToString() }; var client = new MongoClient(st_now.ConnectionString); var database = client.GetDatabase(st_now.DatabaseName); var Mongo = database.GetCollection<WA_DeviceNowStatusTodb>(st_now.LogsCollectionName); var builder = Builders<WA_DeviceNowStatusTodb>.Filter; var filter = builder.And(builder.Eq("deviceNum", Model.deviceNum), builder.Eq("dr", Model.dr)); var MongoEntity = Mongo.Find(filter).FirstOrDefault(); if (MongoEntity == null) { var Model2 = new WA_DeviceNowStatusTodb { CreateTime = DateTime.Now, cmd = model.cmd, deviceNum = model.id, dr = model.dat[0].dr, ds = model.dat[0].ds, dt = model.dat[0].dt, }; if (!string.IsNullOrEmpty(Model.btinfo)) { btinfoModel TbModel = new btinfoModel(Model.btinfo); Model2.batteryType = 0; Model2.voltage = TbModel.Voltage; Model2.scale = TbModel.SOC; Model2.capacity = TbModel.Caption; Model2.batterySN = TbModel.BettaryNum; Model2.TotalVoltage = TbModel.TotalVoltage; Model2.Electric = TbModel.Electric; Model2.BettaryStatus = TbModel.BettaryStatus; Model2.BettaryStatusString = TbModel.BettaryStatusString; } new MongoLogService<WA_DeviceNowStatusTodb>(st_now).Create(Model2); } else { if (!string.IsNullOrEmpty(Model.btinfo)) { var update = Builders<WA_DeviceNowStatusTodb>.Update.Set("deviceNum", Model.deviceNum).Set("dr", Model.dr).Set("ds", Model.ds).Set("dt", Model.dt).Set("batteryType", Model.batteryType).Set("voltage", Model.voltage).Set("scale", Model.scale).Set("capacity", Model.capacity).Set("batterySN", Model.batterySN).Set("TotalVoltage", Model.TotalVoltage).Set("Electric", Model.Electric).Set("BettaryStatus", Model.BettaryStatus).Set("BettaryStatusString", Model.BettaryStatusString).Set("CreateTime", Model.CreateTime); Mongo.UpdateMany(filter, update); } }
查詢:
4.查詢
4.1 查詢部門是開發部的信息
//創建約束生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; //約束條件 FilterDefinition<BsonDocument> filter = builder.Eq("DepartmentName", "開發部"); //獲取數據 var result = coll.Find<BsonDocument>(filter).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.2 獲取Sum大於4的數據
//創建約束生成器 FilterDefinitionBuilder<BsonDocument> builderFIlter = Builders<BsonDocument>.Filter; //約束條件 FilterDefinition<BsonDocument> filter = builder.Gt("Sum", 4); var result = coll.Find<BsonDocument>(filter).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.3 And約束
//創建約束生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; //約束條件 FilterDefinition<BsonDocument> filter = builder.And(builder.Gt("Sum", "2"), builder.Eq("DepartmentName", "運維")); var result = coll.Find<BsonDocument>(filter).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.4查詢指定值
//創建約束生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter;
ProjectionDefinitionBuilder<BsonDocument> builderProjection = Builders<BsonDocument>.Projection; //Include 包含某元素 Exclude 不包含某元素 ProjectionDefinition<BsonDocument> projection = builderProjection.Include("DepartmentName").Exclude("_id"); var result = coll.Find<BsonDocument>(builderFilter.Empty).Project(projection).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.5 排序
//創建生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; //排序生成器 SortDefinitionBuilder<BsonDocument> builderSort = Builders<BsonDocument>.Sort; //排序約束 Ascending 正序 Descending 倒序 SortDefinition<BsonDocument> sort = builderSort.Ascending("Sum"); var result = coll.Find<BsonDocument>(builderFilter.Empty).Sort(sort).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.6 In查詢
//創建生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; FilterDefinition<BsonDocument> filter = builderFilter.In("DepartmentName", new[] { "測試部", "開發部" }); var result = coll.Find<BsonDocument>(filter).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.7 分頁查詢
//創建生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; //分頁 Skip 跳過 Limit查詢多少 var result = coll.Find<BsonDocument>(builderFilter.Empty).Skip(1).Limit(1).ToList(); foreach (var item in result) { //取出整條值 Console.WriteLine(item.AsBsonValue); }
4.8查詢總條目數
//創建生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; //總條目數 var result = coll.Find<BsonDocument>(builderFilter.Empty).Count();
4.9Linq查詢
//創建生成器//linq var result = from y in coll.AsQueryable() select new { DepartmentName = y["DepartmentName"], id = y["_id"] }; foreach (var item in result) { Console.WriteLine("DepartmentName:" + item.DepartmentName + "====Id:"+item.id); }
4.10分組查詢
//創建生成器 FilterDefinitionBuilder<BsonDocument> builderFilter = Builders<BsonDocument>.Filter; //分組 var result = from y in coll.AsQueryable() group y by y["DepartmentName"] into s select new { DepartmentName = s.Key, Count = s.Count() }; foreach (var item in result) { Console.WriteLine("DepartmentName:" + item.DepartmentName + "====Count:"+item.Count); }
4.11連表查詢
//linq //連表查詢 在這里是自己連自己 var result = from u in coll.AsQueryable() join o in coll.AsQueryable() on u["_id"] equals o["_id"] select new { DepartmentName1 = u["DepartmentName"], DepartmentName2 = u["DepartmentName"] }; foreach (var item in result) { Console.WriteLine("DepartmentName1:" + item.DepartmentName1 + "====DepartmentName2:" + item.DepartmentName2); }
刪除單條數據

public BaseResponse RemoveBatteryOtaSoftWareInfo(RemoveOtaSoftWareInfoModel data) { LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.BatteryOtaEnm.OtaBatterySoftWareInfo.ToString(), DatabaseName = DatabaseName }; var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(DatabaseName); var Mongo = database.GetCollection<OtaSoftWareInfoTb>(settings.LogsCollectionName); var builder = Builders<OtaSoftWareInfoTb>.Filter; if (string.IsNullOrEmpty(data.Id)) { return CommonBaseResponse.SetResponse(false, "請求ID不能為空。"); } else { } var filter = builder.Eq("Id", data.Id); Mongo.DeleteOne(filter); return CommonBaseResponse.SetResponse(true ); }
/// <summary> /// 清除所有表 OTA記錄 測試數據 /// </summary> /// <returns></returns> public async Task<BaseResponse> ClearOtaRecords() { LogstoreDatabaseSettings settings = new LogstoreDatabaseSettings() { LogsCollectionName = CommEnum.BatteryOtaEnm.OtaBatteryReveiceCompletePack.ToString(), DatabaseName = DatabaseName }; var client = new MongoClient(settings.ConnectionString); var database = client.GetDatabase(DatabaseName); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatteryHeartPack.ToString()); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatteryReveiceCompletePack.ToString()); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatteryReveiceShakeHandPack.ToString()); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatteryReveiceSigPack.ToString()); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatterySendCompletePack.ToString()); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatterySendShakeHandPack.ToString()); await database.DropCollectionAsync(BatteryOtaEnm.OtaBatterySendSigPack.ToString()); return CommonBaseResponse.SetResponse(true); }
@天才卧龍的博客