看這篇文章之前請耐心看完MongoDb入門,如果還是堅持不看,那我也沒有辦法。
MongoDB是一個基於分布式文件存儲的數據庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。 它的特點是高性能、易部署、易使用,存儲數據非常方便。
用之前的花,先通過nuget包get一下。
一.集成你自己的MongoDbOperation
這和我們ADO.NET,大家寫的DBhelper差不多,其中只是小有變化。下面是一個helper類,我們基本上都是通過依賴注入你配置構造屬性,其實的collection和db是我們最主要的配置項。
private static MongoDBOperation<T> mongoDBOperation = null;
private MongoDBOperation()
{
mongoClient = new MongoClient("mongodb://localhost:27017");
db = mongoClient.GetDatabase("local");
collection = db.GetCollection<BsonDocument>("zara");
}
通過構造函數我們完成了基本的配置,再通過泛型構造去創建我們MongoDbOperation的實例,這個實例是通過控制器方面的依賴注入進去的。
public static MongoDBOperation<T> GetMongoDBInstance()
{
if (mongoDBOperation == null)
{
lock (nameof(MongoDBOperation<T>))// lockobject)
{
if (mongoDBOperation == null)
{
mongoDBOperation = new MongoDBOperation<T>();
}
}
}
return mongoDBOperation;
}
在控制器方面直接通過依賴注入直接Get 到了 MongoDBOperation實例。
private MongoDBOperation<BsonDocument> mongo = null;
public MongoDBController()
{
mongo = MongoDBOperation<BsonDocument>.GetMongoDBInstance();
}
那最后基本上就是在MongoDBOperation類中寫你需要的方法了,附一份我自己寫的:
namespace MongoDbDemo.Options { public class MongoDBOperation<T> where T : class { private static MongoDBOperation<T> mongoDBOperation = null; private static readonly object lockobject = new object(); private MongoClient mongoClient { get; set; } private IMongoDatabase db { get; set; } private IMongoCollection<BsonDocument> collection { get; set; } private IEnumerable<BsonDocument> documents { get; set; } private MongoDBOperation() { mongoClient = new MongoClient("mongodb://localhost:27017"); db = mongoClient.GetDatabase("local"); collection = db.GetCollection<BsonDocument>("zara"); } public static MongoDBOperation<T> GetMongoDBInstance() { if (mongoDBOperation == null) { lock (nameof(MongoDBOperation<T>))// lockobject) { if (mongoDBOperation == null) { mongoDBOperation = new MongoDBOperation<T>(); } } } return mongoDBOperation; } /// <summary> /// 同步插入數據 /// </summary> /// <param name="document"></param> /// <returns></returns> public bool InsertOneData(BsonDocument document) { try { if (collection != null) { collection.InsertOne(document); return true; } else { return false; } } catch (Exception ex) { return false; } } /// <summary> /// 異步插入 /// </summary> /// <param name="document"></param> /// <returns></returns> public async Task<bool> InsertAsyncOneData(BsonDocument document) { try { if (collection != null) { await collection.InsertOneAsync(document); return true; } else { return false; } } catch (Exception ex) { return false; } } /// <summary> /// 同步插入多條數據 /// </summary> /// <param name="documents"></param> /// <returns></returns> public bool InsertManyData(IEnumerable<BsonDocument> documents) { try { //documents = Enumerable.Range(0, 100).Select(i => new BsonDocument("counter", i)); if (collection != null) { collection.InsertMany(documents); return true; } else { return false; } } catch (Exception ex) { return false; } } /// <summary> /// 同步插入多條數據 /// </summary> /// <param name="documents"></param> /// <returns></returns> public async Task<bool> InsertAsyncManyData(IEnumerable<BsonDocument> documents) { try { //documents = Enumerable.Range(0, 100).Select(i => new BsonDocument("counter", i)); if (collection != null) { await collection.InsertManyAsync(documents); return true; } else { return false; } } catch (Exception ex) { return false; } } /// <summary> /// 查找有數據。 /// </summary> /// <returns></returns> public List<BsonDocument> FindData() { return collection.Find(new BsonDocument()).ToList(); } /// <summary> /// 取排除_id字段以外的數據。然后轉換成泛型。 /// </summary> /// <returns></returns> public List<BsonDocument> FindAnsyncData() { var document = collection.Find(new BsonDocument()).ToListAsync().Result; return document; } /// <summary> /// 按某些列條件查詢 /// </summary> /// <param name="bson"></param> // <returns></returns> public List<BsonDocument> FindFilterlData(BsonDocument bson) { var buildfilter = Builders<BsonDocument>.Filter; FilterDefinition<BsonDocument> filter = null; foreach (var bs in bson) { filter = buildfilter.Eq(bs.Name, bs.Value); } //filter = buildfilter.Eq("name", "MongoDBTest"); var documents = collection.Find(filter).ToList(); return documents; } /// <summary> /// 返回受影響行 /// </summary> /// <returns></returns> public long DeleteData() { //刪除count大於0的文檔。 var filter = Builders<BsonDocument>.Filter.Gt("count", 0); DeleteResult deleteResult = collection.DeleteMany(filter); return deleteResult.DeletedCount; } /// <summary> /// 根據id更新文檔中單條數據。 /// </summary> /// <param name="_id"></param> /// <param name="bson"></param> public UpdateResult UpdateOneData(string _id, BsonDocument bson) { //修改條件(相當於sql where) FilterDefinition<BsonDocument> filter = Builders<BsonDocument>.Filter.Eq("name", "MongoDB"); UpdateDefinition<BsonDocument> update = null; foreach (var bs in bson) { if (bs.Name.Equals("name")) { update = Builders<BsonDocument>.Update.Set(bs.Name, bs.Value); } } //UpdateDefinition<BsonDocument> update = Builders<BsonDocument>.Update.Set("name", bson[0].ToString()); UpdateResult result = collection.UpdateOne(filter, update);//默認更新第一條。 return result; } /// <summary> /// bsonvalue to list<string> /// </summary> public List<string> getStrListByBson(BsonValue bsonValuestr) { return bsonValuestr.ToString().Trim('[').Trim(']').Split(",").ToList(); } /// <summary> /// 根據_id刪除文檔行 /// </summary> public long DelDocumentById(string _id) { var filter = Builders<BsonDocument>.Filter.Eq("_id", new ObjectId(_id)); DeleteResult result = collection.DeleteOne(filter); return result.DeletedCount; } } }
如果說你不知道里面的方法,你可以通通過F12去看collection中的方法(前提你是在VS的情況下)
我們再通過這玩膩去搞個小demo,控制器:
public class MongoDBController : Controller { private MongoDBOperation<BsonDocument> mongo = null; public MongoDBController() { mongo = MongoDBOperation<BsonDocument>.GetMongoDBInstance(); } /// <summary> /// get首次加載 /// </summary> /// <returns>返回視圖模型</returns> public IActionResult Index() { List<MongoDbModel> mdList = new List<MongoDbModel>(); if (mongo != null) { List<BsonDocument> document = mongo.FindAnsyncData(); for (int i = 0; i < document.Count; i++) { MongoDbModel md = new MongoDbModel() { id = document[i]["_id"].ToString(), title = document[i]["title"].ToString(), url = document[i]["title"].ToString(), likes = document[i]["likes"].ToDouble(), tags = mongo.getStrListByBson(document[i]["tags"]) }; mdList.Add(md); } } return View(mdList); } /// <summary> /// 查詢 /// </summary> /// <param name="dbname">條件1</param> /// <returns>mongoDbList</returns> public IActionResult queryMongoDb(string dbname) { List<MongoDbModel> mdList = new List<MongoDbModel>(); if (!string.IsNullOrWhiteSpace(dbname)) { List<BsonDocument> document = mongo.FindFilterlData(new BsonDocument() { {"title",dbname} }); for (int i = 0; i < document.Count; i++) { MongoDbModel md = new MongoDbModel() { id = document[i]["_id"].ToString(), title = document[i]["title"].ToString(), url = document[i]["title"].ToString(), likes = document[i]["likes"].ToDouble(), tags = mongo.getStrListByBson(document[i]["tags"]) }; mdList.Add(md); } } return PartialView("MongoDbPartial", mdList); } public long delById(string id) { return mongo.DelDocumentById(id); }
在view中我想減小耦合度,如果是非常復雜的頁面中,前提這不是MVVM,我一般喜歡把局部視圖放到Shared文件夾中,其定義如下:
@model IEnumerable<MongoDbDemo.Models.MongoDbModel> <table class="table"> <thead> <tr> <th> @Html.DisplayNameFor(model => model.id) </th> <th> @Html.DisplayNameFor(model => model.title) </th> <th> @Html.DisplayNameFor(model => model.url) </th> <th> @Html.DisplayNameFor(model => model.tags) </th> <th> @Html.DisplayNameFor(model => model.likes) </th> <th></th> </tr> </thead> <tbody> @foreach (var item in Model) { <tr> <td> @Html.DisplayFor(modelItem => item.id) </td> <td> @Html.DisplayFor(modelItem => item.title) </td> <td> @Html.DisplayFor(modelItem => item.url) </td> <td> @{ foreach (var tagsItems in item.tags) { <p>@tagsItems</p> } } </td> <td> @Html.DisplayFor(modelItem => item.likes) </td> <td> @Html.ActionLink("Delete", "delById", "MongoDB",new { id = item.id}) </td> </tr> } </tbody> </table>
主視圖,直接通過 @Html.Partial 標簽進行引用。
@model IEnumerable<MongoDbDemo.Models.MongoDbModel> @{ Layout = null; } <script typet="text/javascript" src="http://libs.baidu.com/jquery/1.9.1/jquery.min.js"></script> <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <form> <p> <a asp-action="Create">Create New</a> <div> 名稱:<input type="text" placeholder="條件1" id="selName"/> <input type="button" value="查詢" id="butn" /> </div> <div id="datamain"> @Html.Partial("/Views/Shared/MongoDbPartial.cshtml", Model) </div> </p> </form> <script> $(function () { $("#butn").click(function () { var nameval = $("#selName").val(); alert(nameval); $.ajax({ url: "/MongoDB/queryMongoDb", data: { dbname: nameval }, type: "get", success: function (datas) { console.log(datas); $("#datamain").html(datas); } }) }) }) </script> </body> </html>
最后附MongoDb官方文檔:https://docs.mongodb.com/