配置文件
{
"ConnectionStrings": {
"ConnectionString": "mongodb://admin:123456@192.168.1.6:27017",
"DatabaseName": "testdb"
}
}
首先引用包
<PackageReference Include="Microsoft.Extensions.Configuration" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="3.1.2" />
<PackageReference Include="Microsoft.Extensions.Logging" Version="3.1.2" />
<PackageReference Include="MongoDB.Driver" Version="2.10.2" />
CRUD 操作服務
using System; using System.Collections.Generic; using System.Text; using Microsoft.Extensions.Configuration; using MongoDB.Driver; namespace MongoDbTestConsoleApp { /// <summary> /// 官方 https://api.mongodb.com/csharp/2.2/html/R_Project_CSharpDriverDocs.htm /// https://docs.microsoft.com/zh-cn/aspnet/core/tutorials/first-mongo-app?view=aspnetcore-3.1&tabs=visual-studio /// </summary> /// <typeparam name="T"></typeparam> public class BaseRepository<T> where T : BaseModel { private readonly IMongoCollection<T> _collection; //數據表操作對象 /// <summary> /// 構造函數 /// </summary> /// <param name="config"></param> /// <param name="tableName">表名</param> public BaseRepository(DatabaseSettings config, string tableName) { var client = new MongoClient(config.ConnectionString); //獲取鏈接字符串 var database = client.GetDatabase(config.DatabaseName); //var database = client.GetDatabase(config.GetSection("MongoDBSetting:DBName").Value); //數據庫名 (不存在自動創建) //獲取對特定數據表集合中的數據的訪問 _collection = database.GetCollection<T>(tableName); // (不存在自動創建) } //Find<T> – 返回集合中與提供的搜索條件匹配的所有文檔。 //InsertOne – 插入提供的對象作為集合中的新文檔。 //ReplaceOne – 將與提供的搜索條件匹配的單個文檔替換為提供的對象。 //DeleteOne – 刪除與提供的搜索條件匹配的單個文檔。 /// <summary> /// 獲取所有 /// </summary> /// <returns></returns> public List<T> Get() { return _collection.Find(T => true).ToList(); } /// <summary> /// 獲取單個 /// </summary> /// <param name="id"></param> /// <returns></returns> public T Get(string id) { return _collection.Find<T>(T => T.Id == id).FirstOrDefault(); } /// <summary> /// 創建 /// </summary> /// <param name="T"></param> /// <returns></returns> public T Create(T T) { _collection.InsertOne(T); return T; } /// <summary> /// 更新 /// </summary> /// <param name="id"></param> /// <param name="TIn"></param> public void Update(string id, T TIn) { _collection.ReplaceOne(T => T.Id == id, TIn); } /// <summary> /// 刪除 /// </summary> /// <param name="TIn"></param> public void Remove(T TIn) { _collection.DeleteOne(T => T.Id == TIn.Id); } /// <summary> /// 根據id刪除 /// </summary> /// <param name="id"></param> public void Remove(string id) { _collection.DeleteOne(T => T.Id == id); } } }
配置文件模型
using System; using System.Collections.Generic; using System.Text; namespace MongoDbTestConsoleApp { public class DatabaseSettings { public string ConnectionString { get; set; } public string DatabaseName { get; set; } } }
基礎實體模型
using System; using System.Collections.Generic; using System.Text; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; namespace MongoDbTestConsoleApp { public class BaseModel { [BsonId] //標記主鍵 [BsonRepresentation(BsonType.ObjectId)] //參數類型 , 無需賦值 public string Id { get; set; } [BsonElement(nameof(AddTime))] //指明數據庫中字段名為CreateDateTime public DateTime AddTime { get; set; } [BsonElement(nameof(IsDelete))] public bool IsDelete { get; set; } public BaseModel() { AddTime = DateTime.Now; IsDelete = false; } } }
測試模型
using System; using System.Collections.Generic; using System.Text; namespace MongoDbTestConsoleApp { public class StudentModel:BaseModel { public string Name { get; set; } public int Age { get; set; } } }
另外關於mongodb想直接使用BsonDocument序列化
直接tojson是數據類型是有包裝的 例如ObjectId 是ObjectId("5e5e71be0036020790ea4058")
如果想將mongodb的ObjectId轉換成正常的json格式
{ "_id" : ObjectId("5e5e71be0036020790ea4058"), "Name" : "test" }
{"_id":"5e58c528fbaf8aa66a11cfd9","name":"菜鳥教程"}
或則
{ "_id" : { "$oid" : "5e58c528fbaf8aa66a11cfd9" }, "name" : "菜鳥教程" }
具體代碼如下 可以看到區別
var testconl = mycol.Find(x => true).ToList(); JsonWriterSettings jsonWriterSettings = new JsonWriterSettings(); jsonWriterSettings.OutputMode = JsonOutputMode.Strict; foreach (var item in testconl) { var bsonType = item.BsonType; var dic = new Dictionary<string, object> { }; foreach (var ele in item.Elements) { if (ele.Value is BsonObjectId) { var vid =new BsonString(ele.Value.ToString()); //item.Remove(ele.Name); //item.Add(new BsonElement(ele.Name, vid)); dic.Add(ele.Name, ele.Value.ToString()); } else { dic.Add(ele.Name, ele.Value); } } Console.WriteLine(item.ToJson()); Console.WriteLine(item.ToJson(jsonWriterSettings)); Console.WriteLine(Newtonsoft.Json.JsonConvert.SerializeObject(dic)); }