日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > asp.net >内容正文

asp.net

.NET MongoDB Driver 2.2使用示例

發(fā)布時(shí)間:2025/5/22 asp.net 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET MongoDB Driver 2.2使用示例 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

說明:mongoDBService是對(duì)各種常用操作的封裝

?

public class MongoDBService {#region 變量/// <summary>/// 緩存/// </summary>private static ConcurrentDictionary<string, Lazy<MongoClient>> m_mongoClientCache = new ConcurrentDictionary<string, Lazy<MongoClient>>();/// <summary>/// 連接字符串/// </summary>private string m_connectionStr = string.Empty;/// <summary>/// 數(shù)據(jù)庫(kù)名稱/// 支持運(yùn)行時(shí)更改/// </summary>public string DatabaseName { get; set; }/// <summary>/// 設(shè)置GridFS參數(shù)/// </summary>public GridFSBucketOptions BucksOptions { get; set; }#endregion/// <summary>/// 初始化操作/// </summary>public MongoDBService(string connStr, string database){m_connectionStr = connStr;DatabaseName = database;}/// <summary>/// 獲得Mongo客戶端/// </summary>/// <param name="connStr">連接串</param>/// <returns></returns>private static MongoClient GetClient(string connStr){if (string.IsNullOrWhiteSpace(connStr)) throw new ArgumentException("MongoDB Connection String is Empty");return m_mongoClientCache.GetOrAdd(connStr,new Lazy<MongoClient>(() =>{return new MongoClient(connStr);})).Value;}/// <summary>/// 插入操作/// </summary>/// <param name="collectionName">集合名</param>/// <param name="t">插入的對(duì)象</param>/// <returns>返回是否插入成功true or false</returns>public bool Insert<T>(string collectionName, T t){if (string.IsNullOrWhiteSpace(collectionName)) throw new ArgumentException("collectionName是null、空或由空白字符組成");MongoClient client = GetClient(m_connectionStr);var db = client.GetDatabase(DatabaseName);var collection = db.GetCollection<T>(collectionName);Task task = collection.InsertOneAsync(t);task.Wait();return !task.IsFaulted;}

    //其他操作...... }

?

數(shù)據(jù)模型

   /// <summary>/// 沒有子文檔的模型/// </summary>public class Model1{public string Field1A { set; get; }public int Field1B { set; get; }public double Field1C { set; get; }public float Field1D { set; get; }public List<string> Field1E { set; get; }}/// <summary>/// 含有子文檔和_id字段/// </summary>public class Model2{public string Id { set; get; }public string Field2A { set; get; }public DateTime Field2B { set; get; }public List<Model1> Field2C { set; get; }}

?

一、簡(jiǎn)單操作

1創(chuàng)建文檔

//錯(cuò)誤寫法1.字符串未加引號(hào)/* *“System.FormatException”類型的未經(jīng)處理的異常在 MongoDB.Bson.dll 中發(fā)生 * 其他信息: Invalid JSON number '1A'.*/string json1Error = @"{'Id': 1AAAA1}";//改正string json1Right = @"{'Id':'1AAAA1'}";//錯(cuò)誤寫法2.集合中的引號(hào)嵌套/** System.FormatException”類型的未經(jīng)處理的異常在 MongoDB.Bson.dll 中發(fā)生 * 其他信息: JSON reader was expecting ':' but found '':''.*/string json2Error = @"{'Field2B': '[{'Field1E':'[]'}]'}"; //改正string json2Right = @"{'Field2B': [{'Field1E':[]}]}";//錯(cuò)誤寫法3 構(gòu)造鍵值對(duì)時(shí),“:”使用中文輸入法/** System.FormatException”類型的未經(jīng)處理的異常在 MongoDB.Bson.dll 中發(fā)生 * 其他信息: Invalid JSON input ''.*/string json3Error = @"{'Id':'1AAAA1'}"; //改正string json3Right = @"{'Id':'1AAAA1'}";#endregion//將json轉(zhuǎn)換為BsonDocumentstring json = @"{ 'Id':'100000000001','Field2A':'100','Field2B':'20160913', 'Field2C':[{ 'Field1A':'在MongoDB中一條記錄是一個(gè)文檔','Field1B':1,'FieldC':13.14, 'Field1D':'13.14F','Field1E':[]}]}";BsonDocument doc1 = BsonDocument.Parse(json3Right);//也可以這樣創(chuàng)建BsonDocument doc2 = new BsonDocument{{ "Id", "100000000000" },{ "Field2A","100"},{ "Field2B",DateTime.Now},{ "Field2C", new BsonArray{new BsonDocument("Field1A","MongoDB具有高性能,高可用性,高擴(kuò)展性"),new BsonDocument("Field1B",1),new BsonDocument("Field1C",0.618),new BsonDocument("Field1D",0.618F),new BsonDocument("Field1E",new BsonArray()),}}};

2 插入文檔

調(diào)用的主要方法IMongoCollection<TDocument>.InsertOneAsync

Model2 model = new Model2 {Id = Guid.NewGuid().ToString("N"),Field2A = "2",Field2B = DateTime.Now.Date,Field2C = new List<Model1>()};for (int i = 0; i < 5; i++){Model1 model1 = new Model1 {Field1A = "Welcome to the MongoDB",Field1B = i,Field1C = 3.1415926,Field1D = 3.1415926F,Field1E = new List<string>()};model.Field2C.Add(model1);}//插入一個(gè)collectionbool t = mongoDBService.Insert(collectionName, model);

結(jié)果:

3刪除文檔

調(diào)用主要方法IMongoCollection<TDocument>.DeleteMany

mongoDBService.Delete<Model2>(collectionName, m => m.Field2A.Equals(DateTime.Parse("2016-09-08")));

二、復(fù)雜操作

1插入子文檔

調(diào)用主要方法IMongoCollection<TDocument>.UpdateMany

       Model1 model1 = new Model1{Field1A = "MongoDB是一種開源文檔型數(shù)據(jù)庫(kù)",Field1B = 100,Field1C = 3.1415926,Field1D = 3.1415926F,Field1E = new List<string>()};Model2 model2 = new Model2{Id = new Guid().ToString("N"),Field2A = "1",Field2B = DateTime.Now.Date,Field2C = new List<Model1>()};FilterDefinitionBuilder<Model2> filterBuilder = Builders<Model2>.Filter;//過濾條件字段Field2A==2FilterDefinition<Model2> filter = filterBuilder.Eq(doc => doc.Field2A, "1");SortDefinitionBuilder<Model1> sortBuilder = Builders<Model1>.Sort;//按字段Field1A升序排列SortDefinition<Model1> sort = sortBuilder.Ascending(pu => pu.Field1A);//最新插入的在最前面,這是通過將PushEach方法的參數(shù)position設(shè)置為0實(shí)現(xiàn)的UpdateDefinitionBuilder<Model2> updateBuilder = Builders<Model2>.Update;UpdateDefinition<Model2> update = updateBuilder.PushEach(doc => doc.Field2C, new List<Model1> { model1 }, null, 0, sort);UpdateResult updateResult = mongoDBService.DocumentUpdate(collectionName, filter, update);

執(zhí)行結(jié)果:

2更新子文檔

?

調(diào)用主要方法IMongoCollection<TDocument>.UpdateMany

       string commentContent = "通過Update修改了";FilterDefinitionBuilder<Model2> filterBuilder = Builders<Model2>.Filter;//找到父文檔,過濾條件為Field2A=2并且Field2B=“2018-01-21T16:00:00.000Z”FilterDefinition<Model2> filterFather = filterBuilder.Eq(doc => doc.Field2A, "1")& filterBuilder.Eq(doc => doc.Field2B, DateTime.Parse("2016/9/13 0:00:00"));//找到子文檔,過濾條件Field1B=1,條件作用與字段Field2C,他是個(gè)集合,用來存儲(chǔ)子文檔FilterDefinition<Model2> childFilter = filterBuilder.ElemMatch(listField => listField.Field2C, childfield => childfield.Field1B == 100);//上述條件的并FilterDefinition<Model2> filter = Builders<Model2>.Filter.And(new FilterDefinition<Model2>[] { filterFather, childFilter });//使用XXXX.$.XXXX定位字段var update = Builders<Model2>.Update.Set("Field2C.$.Field1A", commentContent);UpdateResult updateResult = mongoDBService.DocumentUpdate(collectionName, filter, update);

運(yùn)行結(jié)果:

3 找到某一個(gè)子文檔

?

調(diào)用主要方法IMongoCollection<TDocument>.Find,將調(diào)用結(jié)果轉(zhuǎn)化為List<T>,然后取第一個(gè)元素。

       FilterDefinitionBuilder<Model2> filterBuilder = Builders<Model2>.Filter;//找到父文檔,過濾條件為Field2A=2并且Field2B=“2018-01-21T16:00:00.000Z”FilterDefinition<Model2> filterFather = filterBuilder.Eq(doc => doc.Field2A, "2")& filterBuilder.Eq(doc => doc.Field2B, DateTime.Parse("2018-01-21T16:00:00.000Z"));//投影定義創(chuàng)建器:ProjectionDefinitionBuilder//用ProjectionDefinition過濾子文檔,投影器創(chuàng)建器作用于Field2C,他是一個(gè)集合,用來保存多個(gè)子文檔;過濾條件為Field1C = 3.1415926ProjectionDefinitionBuilder<Model2> projBuilder = Builders<Model2>.Projection;ProjectionDefinition<Model2> proj = projBuilder.ElemMatch(listField => listField.Field2C, childfield => childfield.Field1C == 3.1415926);FindOptions options = new FindOptions() { AllowPartialResults = true };Model2 info = mongoDBService.Single<Model2>(collectionName, filterFather, options, proj);

結(jié)果:

4 獲得所有子文檔

調(diào)用主要方法IMongoCollection<TDocument>.Find

       //投影定義創(chuàng)建器:ProjectionDefinitionBuilder//用ProjectionDefinition過濾子文檔ProjectionDefinitionBuilder<Model2> projBuilder = Builders<Model2>.Projection;ProjectionDefinition<Model2> proj = projBuilder.ElemMatch(listField => listField.Field2C, childfield => childfield.Field1B ==0);List<Model2> info = mongoDBService.List<Model2>(collectionName,m => m.Field2A == "2" && m.Field2B == DateTime.Parse("2018-01-21T16:00:00.000Z"), proj);

5文檔排序

調(diào)用主要方法IMongoCollection<TDocument>.Find

       SortDefinitionBuilder<Model2> sortBuilder = Builders<Model2>.Sort;////按字段Field2A降序排列SortDefinition<Model2> sort = sortBuilder.Descending(m => m.Field2A);List<Model2> info = mongoDBService.FindAllList(collectionName, sort);

6內(nèi)嵌文檔分頁(yè)

調(diào)用主要方法IMongoCollection<TDocument>.Find

若匹配出多個(gè)文檔,取第一個(gè)元素

?

       //投影定義創(chuàng)建器:ProjectionDefinitionBuilder//用ProjectionDefinition過濾子文檔ProjectionDefinitionBuilder<Model2> projBuilder = Builders<Model2>.Projection;//Include :確定要包含哪些字段值(即給哪些字段賦值)//Slice:獲得子文檔集合分片,第一個(gè)參數(shù)field指取出的子文檔集合,第二各參數(shù)skip指跳過多少個(gè)子文檔,第三個(gè)參數(shù)limit取出多少個(gè)ProjectionDefinition<Model2> proj = projBuilder.Include(m => m.Field2C).Slice(m => m.Field2C, 1, 3);//過濾條件是Field2A=2Model2 doc = mongoDBService.SubdocumentPageList<Model2>(collectionName, m => m.Field2A == "2", proj);

?

7刪除子文檔

調(diào)用主要方法IMongoCollection<TDocument>.UpdateOne

       //過濾器作用與Field2C字段,過濾條件是Field1B = 1var update = Builders<Model2>.Update.PullFilter(m => m.Field2C, (y => y.Field1B == 2));//父文檔過濾條件為Field2A=2,如果匹配出多個(gè)父文檔,只操作第一個(gè)文檔mongoDBService.UpdateOne<Model2>(collectionName, m => m.Field2A == "2", update);

8聚集操作

調(diào)用主要方法IMongoCollection<TDocument>.Aggregate

1)篩選數(shù)據(jù)

       //unwind階段var unwind = new BsonDocument{{"$unwind","$Field2C"}};//match階段。匹配條件Field2A=2,Field1B=1//注意Field2A為字符串類型,2用引號(hào)包起來;而Field1B為整形,所以1不能用引號(hào)包起來var match = new BsonDocument{{"$match",new BsonDocument{{"Field2A","2" },{"Field2C.Field1B",1 }}}};//group階段var group = new BsonDocument{{"$group",new BsonDocument{{"_id","$Field1C"},{"Field2C",new BsonDocument{{"$push","$Field2C"}}}} }};var r = mongoDBService.Aggregate<Model2>(collectionName, new BsonDocument[] { unwind, match, group });//也可以使用var r = mongoDBService.Aggregate(collectionName, unwind, match, group);

2)獲得數(shù)組大小

?

      var match = new BsonDocument{{"$match",new BsonDocument{{"Field2A","2"}}}};var project = new BsonDocument{{"$project",new BsonDocument{{"NumofArray",new BsonDocument{{ "$size", "$Field2C" }}}}}};BsonDocument bson = mongoDBService.Aggregate<BsonDocument>(collectionName, new BsonDocument[] { match, project }).FirstOrDefault<BsonDocument>();int count = bson != null?bson.GetValue("NumofArray").AsInt32:0;

?MongoDBService下載地址:https://files.cnblogs.com/files/hdwgxz/MongoDBService.rar

?

-----------------------------------------------------------------------------------------

轉(zhuǎn)載與引用請(qǐng)注明出處。

時(shí)間倉(cāng)促,水平有限,如有不當(dāng)之處,歡迎指正。

轉(zhuǎn)載于:https://www.cnblogs.com/hdwgxz/p/8335196.html

總結(jié)

以上是生活随笔為你收集整理的.NET MongoDB Driver 2.2使用示例的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。