【愚公系列】2022年05月 .NET架构班 059-分布式中间件 .Net Core下使用Mongodb的封装
【摘要】 一、Mongodb的基本概念 1.Mongodb的数据结构SQL术语/概念MongoDB术语/概念解释/说明databasedatabase数据库tablecollection数据库表/集合rowdocument数据记录行/文档columnfield数据字段/域indexindextable joins表连接,MongoDB不支持primary keyprimary key主键,Mongo...
一、Mongodb的基本概念
1.Mongodb的数据结构
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
2.Mongodb数据类型
MongoDB的最小存储单位就是文档(document)对象。文档(document)对象对应于关系型数据库的行。数据在MongoDB中以BSON(Binary-JSON)文档的格式存储在磁盘上。
BSON(Binary Serialized Document Format)是一种类json的一种二进制形式的存储格式,简称Binary JSON。BSON和JSON一样,支持内嵌的文档对象和数组对象,但是BSON有JSON没有的一些数据类型,如Date和BinData类型。
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
二、Mongodb的代码封装
1.配置文件
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"ProductMongoDBOptions": {
"ConnectionString": "mongodb://localhost:27017",
"DatabaseName": "ProductDb_3",
"ProductCollectionName": "Product_3"
},
"AllowedHosts": "*"
}
2.扩展类
/// <summary>
/// MongoDB扩展方法
/// </summary>
public static class MongoDBServiceCollectionExtensions
{
public static IServiceCollection AddMongoDB(this IServiceCollection services, IConfiguration Configuration)
{
// 1、获取配置文件数据
ProductMongoDBOptions productMongoDBOptions = (ProductMongoDBOptions)Configuration.GetSection(nameof(ProductMongoDBOptions));
// 1、建立MongoDB连接
var client = new MongoClient(productMongoDBOptions.ConnectionString);
// 2、获取商品库
var database = client.GetDatabase(productMongoDBOptions.DatabaseName);
// 3、获取商品表(集合)
var _products = database.GetCollection<Product>(productMongoDBOptions.ProductCollectionName);
services.AddSingleton(_products);
return services;
}
}
3.注入扩展类
services.AddMongoDB();
4.使用
4.1 相关依赖
public class Product
{
[BsonId]
[BsonRepresentation(BsonType.ObjectId)]
public string Id { set; get; }
public string ProductCode { set; get; } //商品编码
public string ProductUrl { set; get; } // 商品主图
public string ProductTitle { set; get; } //商品标题
public string ProductDescription { set; get; } // 图文描述
public decimal ProductVirtualprice { set; get; } // 商品虚拟价格
public decimal ProductPrice { set; get; } //价格
public int ProductSort { set; get; } //商品序号
public int ProductSold { set; get; } //已售件数
public int ProductStock { set; get; } //商品库存
public string ProductStatus { set; get; } // 商品状态
public int score { set; get; } //商品级别
}
public interface IProductService
{
void Create(Product Product);
public void CreateList(List<Product> Products);
IEnumerable<Product> GetProducts();
Product GetProductById(string id);
public IEnumerable<Product> GetProductsByPage(int Page, int PageSize);
public IEnumerable<Product> GetProductsBySort(Product product, int Page, int PageSize);
public IEnumerable<int> GetProductsByAggregation(Product product);
void Update(string id,Product Product);
public void UpdateList(string id, Product Product);
// 更新字段
public void UpdateFiled(string id, ProductUpdateFiledDto productUpdateFiledDto);
void Delete(Product Product);
public void DeleteList(Product Product);
bool ProductExists(string id);
// 字段修改
public void Replace(string id, Product Product);
// 创建索引
public string CreateIndex();
}
/// <summary>
/// 商品服务实现
/// </summary>
public class ProductService : IProductService
{
private readonly IMongoCollection<Product> _products;
public ProductService(
/* IMongoCollection<Product> products,*/
IConfiguration configuration/*,IOptions<ProductMongoDBOptions> options*/)
{
// 1、建立MongoDB连接
//var client = new MongoClient("mongodb://localhost:27018,localhost:27019,localhost:27020");
var client = new MongoClient("mongodb://localhost:27000,localhost:27100");
// 2、获取商品库(自己创建商品数据)
var database = client.GetDatabase("ProductDb");
// 3、获取商品表(自己创建商品数)
_products = database.GetCollection<Product>("Product");
// _products = products;
}
public void Create(Product Product)
{
_products.InsertOne(Product);
}
public void CreateList(List<Product> Products)
{
_products.InsertMany(Products);
}
public void Delete(Product Product)
{
_products.DeleteOne(product => product.Id == Product.Id);
}
public void DeleteList(Product Product)
{
_products.DeleteMany(product => product.Id == Product.Id);
}
public Product GetProductById(string id)
{
return _products.Find<Product>(product => product.Id == id).FirstOrDefault();
}
public IEnumerable<Product> GetProducts()
{
return _products.Find(product => true).ToList();
}
/// <summary>
/// 商品不同字段获取
/// </summary>
/// <returns></returns>
public IEnumerable<Product> GetProductsFiled()
{
var filter = Builders<BsonDocument>.Filter;
/* BsonDocument filter = new BsonDocument();
var collection = _mongoDatabase.GetCollection<BsonDocument>("ProductDb");
var s = collection.Find(filter).ToList();
using (var cursor = collection.FindAsync(filter).Result)
{
while (cursor.MoveNextAsync().Result)
{
var batch = cursor.Current;
foreach (BsonDocument document in batch)
{
Console.WriteLine(document.ToJson());
}
}
}*/
return _products.Find(product => true).ToList();
}
/*/// <summary>
/// 商品数量查询
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public long GetCount(int Page, int PageSize)
{
var skip = (Page - 1) * PageSize;
return _products.Count();
}*/
/// <summary>
/// 商品分页查询
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public IEnumerable<Product> GetProductsByPage(int Page,int PageSize)
{
var skip = (Page - 1) * PageSize;
return _products.Find(x => true).Skip(skip).Limit(PageSize).ToList();
}
/// <summary>
/// 商品排序
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public IEnumerable<Product> GetProductsBySort(Product product, int Page, int PageSize)
{
var skip = (Page - 1) * PageSize;
return _products.Find(product => true).SortBy(product => product.ProductSort).ToList();
}
/// <summary>
/// 商品价格聚合查询
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public IEnumerable<int> GetProductsByAggregation(Product product)
{
var filter = Builders<BsonDocument>.Filter;
PipelineDefinition<Product, int> pipelineDefinitions = PipelineDefinition<Product,int>.Create("ProductPrice");
var ints = _products.Aggregate<int>(pipelineDefinitions);
while (ints.MoveNext())
{
var test = ints.Current;
return test;
}
return null;
}
/// <summary>
/// 更新
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public void Update(string id, Product Product)
{
var update = Builders<Product>.Update;
_products.UpdateOne(product => product.Id == id, update.Set("ProductTitle", Product.ProductTitle));
}
/// <summary>
/// 更新字段(增加字段)
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public void UpdateFiled(string id, ProductUpdateFiledDto productUpdateFiledDto)
{
var update = Builders<Product>.Update;
_products.UpdateOne(product => product.Id == id, update.AddToSet("ProductTest", productUpdateFiledDto.ProductLike));
}
/// <summary>
/// 批量更新
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public void UpdateList(string id, Product Product)
{
var filter = Builders<Product>.Filter;
var update = Builders<Product>.Update;
_products.UpdateMany(product => product.ProductCode == Product.ProductCode, update.Set("ProductTitle", Product.ProductTitle));
}
/// <summary>
/// 创建索引
/// </summary>
/// <returns></returns>
public string CreateIndex()
{
var indexKeys = Builders<Product>.IndexKeys;
return _products.Indexes.CreateOne(indexKeys.Descending("ProductCode"));
}
// 原理
// 分片集群
// 分片复制集群
/// <summary>
/// 替换
/// </summary>
/// <param name="id"></param>
/// <param name="Product"></param>
public void Replace(string id, Product Product)
{
_products.ReplaceOneAsync(x => x.Id == id, Product);
}
public bool ProductExists(string id)
{
Product product = _products.Find<Product>(product => product.Id == id).FirstOrDefault();
if (product != null)
{
return true;
}
return false;
}
}
4.使用
/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("Product")]
public class ProductController : ControllerBase
{
private readonly ILogger<ProductController> _logger;
private readonly IProductService _productService;
public ProductController(ILogger<ProductController> logger, IProductService productService)
{
_logger = logger;
_productService = productService;
}
/// <summary>
/// 添加商品
/// </summary>
/// <param name="product"></param>
/// <returns></returns>
[HttpPost]
public ActionResult<Product> CreateProduct(Product product)
{
_productService.Create(product);
return CreatedAtAction("GetProduct", new { id = product.Id }, product);
}
/// <summary>
/// 批量添加商品
/// </summary>
/// <param name="product"></param>
/// <returns></returns>
[HttpPost("ProductList")]
public ActionResult<Product> CreateProductList(Product[] Products)
{
_productService.CreateList(Products.ToList());
return CreatedAtAction("GetProduct", Products);
}
/// <summary>
/// 查询商品列表
/// </summary>
/// <returns></returns>
[HttpGet]
public ActionResult<IEnumerable<Product>> GetProducts()
{
return _productService.GetProducts().ToList();
}
/// <summary>
/// 商品单个商品
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
[HttpGet("{id}")]
public ActionResult<Product> GetProduct(string id)
{
var product = _productService.GetProductById(id);
if (product == null)
{
return NotFound();
}
return product;
}
/// <summary>
/// 商品分页查询
/// </summary>
/// <param name="Page"></param>
/// <param name="PageSize"></param>
/// <returns></returns>
[HttpGet("Page")]
public ActionResult<IEnumerable<Product>> GetProductsByPage(int Page ,int PageSize)
{
return _productService.GetProductsByPage(Page, PageSize).ToList();
}
[HttpGet("Aggregation")]
public ActionResult<IEnumerable<int>> GetProductsByAggregation(Product product)
{
return _productService.GetProductsByAggregation(product).ToList();
}
/// <summary>
/// 修改商品
/// </summary>
/// <param name="id"></param>
/// <param name="product"></param>
/// <returns></returns>
[HttpPut("{id}")]
public IActionResult PutProduct(string id, Product product)
{
try
{
_productService.Update(id,product);
}
catch (Exception)
{
throw;
}
return NoContent();
}
/// <summary>
/// 修改商品
/// </summary>
/// <param name="id"></param>
/// <param name="product"></param>
/// <returns></returns>
[HttpPut("UpdateField")]
public IActionResult PutFieldProduct(string id, ProductUpdateFiledDto productUpdateFiledDto)
{
try
{
_productService.UpdateFiled(id, productUpdateFiledDto);
}
catch (Exception)
{
throw;
}
return NoContent();
}
/// <summary>
/// 商品文档批量修改
/// </summary>
/// <param name="id"></param>
/// <param name="product"></param>
/// <returns></returns>
[HttpPut("UpdateList")]
public IActionResult PutProductList(string id, Product product)
{
try
{
_productService.UpdateList(id, product);
}
catch (Exception)
{
throw;
}
return NoContent();
}
/// <summary>
/// 删除商品
/// </summary>
/// <param name="product"></param>
/// <returns></returns>
[HttpDelete]
public IActionResult DeletetProduct(Product product)
{
try
{
_productService.Delete(product);
}
catch (Exception)
{
throw;
}
return NoContent();
}
// PUT: api/Products/5
[HttpPost("CreateIndex")]
public IActionResult CreateIndex()
{
try
{
_productService.CreateIndex();
}
catch (Exception)
{
throw;
}
return NoContent();
}
}
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)