【愚公系列】2022年05月 .NET架构班 059-分布式中间件 .Net Core下使用Mongodb的封装

举报
愚公搬代码 发表于 2022/05/08 21:29:48 2022/05/08
【摘要】 一、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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。