看這篇文章之前請耐心看完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/
