简介
MongoDB 是一个不同于 MySQL、SQL Server 等传统关系型数据库的面向文档的数据库管理系统,它是由 C++ 语言编写,基于分布式文件存储,为 WEB 应用提供了可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
{
"_id": "ObjectId('AAA123')",
"name": "Zerow",
"company": "Myc",
"website": "www.zerow.cn",
"addresses": [
{ "street": "1s", "city": "Wuhan", "cc": "CN" },
{ "street": "8n", "city": "Beijing", "cc": "CN" }
]
}
本文介绍在 .NET 6 环境下创建一个类库项目来实现对 MongoDB 数据库的增删改查,同时我们使用 MongoDB 提供的 云端的数据库服务-MongoDB Atlas
,这样就无须在本地安装配置 MongoDB 服务了。
创建 .Net 6 类库项目
新建项目
安装包
安装 MongoDB 数据库的驱动:MongoDB.Driver
PM> Install-Package MongoDB.Driver -Version 2.17.1
创建 MongoDbHelper 类
这里将 C# 中对 MongoDB 数据库的增删改查封装到 MongoDbHelper 类,便于操作。
插入数据
public void Insert<TDoc>(TDoc doc, InsertOneOptions options = null) { string collectionName = typeof(TDoc).Name; Insert<TDoc>(collectionName, doc, options); } public void Insert<TDoc>(string collectionName, TDoc doc, InsertOneOptions options = null) { var colleciton = GetMongoCollection<TDoc>(collectionName); colleciton.InsertOne(doc, options); }
删除
public bool Delete<TDoc>(Expression<Func<TDoc, bool>> filter, DeleteOptions options = null) { string collectionName = typeof(TDoc).Name; return Delete<TDoc>(collectionName, filter, options); } public bool Delete<TDoc>(string collectionName, Expression<Func<TDoc, bool>> filter, DeleteOptions options = null) { var colleciton = GetMongoCollection<TDoc>(collectionName); return colleciton.DeleteOne(filter, options).IsAcknowledged; }
修改
public void Update<TDoc>(Expression<Func<TDoc, bool>> filter, UpdateDefinition<TDoc> updateFields, UpdateOptions options = null) { string collectionName = typeof(TDoc).Name; Update<TDoc>(collectionName, filter, updateFields, options); } public void Update<TDoc>(string collectionName, Expression<Func<TDoc, bool>> filter, UpdateDefinition<TDoc> updateFields, UpdateOptions options = null) { var colleciton = GetMongoCollection<TDoc>(collectionName); colleciton.UpdateOne(filter, updateFields, options); }
查询
public List<TDoc> Find<TDoc>(Expression<Func<TDoc, bool>> filter, FindOptions options = null) { string collectionName = typeof(TDoc).Name; return Find<TDoc>(collectionName, filter, options); } public List<TDoc> Find<TDoc>(string collectionName, Expression<Func<TDoc, bool>> filter, FindOptions options = null) { var colleciton = GetMongoCollection<TDoc>(collectionName); return colleciton.Find(filter, options).ToList(); }
总数查询
public long Count<TDoc>(string collectionName, EstimatedDocumentCountOptions options = null) { var collection = GetMongoCollection<TDoc>(collectionName); return collection.EstimatedDocumentCount(options); }
创建数据实体类
public class Product { [BsonElement("_id")] public ObjectId Id { get; set; } [BsonElement("name")] public string Name { get; set; } [BsonElement("quantity")] public int Quantity { get; set; } [BsonElement("brand")] public string Brand { get; set; } [BsonElement("MFGD")] public DateTime MFGD { get; set; } [BsonElement("details")] public string Details { get; set; } }
BsonElement
属性是映射实体类与 MongoDB 数据库字段。
MongoDB Atlas 云数据库
上述程序结构准备妥当,现在我们需要连接一个 MongoDB 数据库来对数据进行增删改查,可以自己官方下载后在本地安装配置,不过 MongoDB 官方也提供了一个免费的云托管数据库-MongoDB Atlas,下面申请注册一个账号。
注册账号
进入注册页面,填写个人信息。
创建集群
选择“Shared”免费选项
- 设置用户名和密码用来访问数据库,
- 设置数据库可访问 IP,选择“My Local Environment”,IP Adress 中填入“0.0.0.0/0”,开启所有 IP 访问权限。
云提供商可选择 “AWS”->“Hong Kong”,默认集群选项是“M0 Sandbox (Shared RAM, 512 MB Storage)”
创建数据库和集合
进入集群主页,点击左侧“Database”->“Browser Collections”->”Create Database”
获取数据库连接
点击左侧“Database”->”Connect”->”Connect your application”
在 DRIVER 中选择 “C#/.NET”,VERSION 可选择最新版,然后点击连接字符串后面的复制按钮。
连接数据库
获取到 MongoDB 的数据库连接字符串后回到第二步创建的项目,将代码中的“连接字符串”替换为上一步获取到实际连接字符串。
连接字符串示例:mongodb+srv://UserName:<password>@cluster0.mongodb.net/?retryWrites=true&w=majority
private MongoClient CreateMongoClient()
{
return new MongoClient("连接字符串");
}
private MongoDB.Driver.IMongoDatabase GetMongoDatabase()
{
if (database == null)
{
database = CreateMongoClient().GetDatabase(databaseName);
}
return database;
}
增删改查
using dotnet.mongodb;
MongoDbHelper _client = new("demo");
插入
var product = new Product()
{
Name = "NAC55",
Brand = "SONY",
MFGD = DateTime.Now,
Quantity = 1,
Details = "synchronous motor"
};
_client.Insert("product", product);
删除
_client.Delete<Product>("product",a=>a.Name== "NAC55");
修改
var update = Builders<Product>.Update
.Set(p => p.Quantity, 12);
_client.Update<Product>("product", a => a.Name == "NAC55", update);
查询
var productList= _client.Find<Product>("product", a=>a.Name== "NAC55");
foreach (var product in productList)
{
Console.WriteLine(product.Name);
}
总数查询
var result = _client.Count<Product>("product");
Console.WriteLine(result);