【愚公系列】2022年05月 .NET架构班 058-分布式中间件 .Net Core下使用Mongodb增删改查

举报
愚公搬代码 发表于 2022/05/06 23:59:06 2022/05/06
【摘要】 前言mysql和mongdb区别:MySQLMongoDB表集合行文档列字段joins嵌入文档或者链接Mongodb语法汇总如下:# 插入db.集合名称.insert(数据)#查找全部db.集合名称.find()#查询一个db.集合名称.findOne({userid:'01'})db.集合名称.find().limit(3)# 修改文档db.集合名称.update(条件,修改后数据)# ...

前言

mysql和mongdb区别:

MySQL MongoDB
集合
文档
字段
joins 嵌入文档或者链接

Mongodb语法汇总如下:

# 插入
db.集合名称.insert(数据)
#查找全部
db.集合名称.find()
#查询一个
db.集合名称.findOne({userid:'01'})
db.集合名称.find().limit(3)
# 修改文档
db.集合名称.update(条件,修改后数据)
# 删除全部文档
db.集合名称.remove({})
# 删除指定文档
db.集合名称.remove({_id:'1'})
# 统计条数
db.集合名称.count()
# 根据条件统计条数
db.集合名称.count({content:'内容'})
# 模糊查询   MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:/模糊查询字符串/
db.集合名称.find({字段名称:/bug/})
# 匹配content中以‘太’开头的数据
db.集合名称.find({字段名称:/^太/})
# 大于 等于 小于
使用这些需要单独将该值再放入一个{}中
db.集合名称.find({ 字段名称 : { $gt: value }}) // 大于: field > value
db.集合名称.find({ 字段名称 : { $lt: value }}) // 小于: field < value
db.集合名称.find({ 字段名称 : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ 字段名称 : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ 字段名称 : { $ne: value }}) // 不等于: field != value
//查询id字段在1和2
db.集合名称.find({字段名称:{$in:["1","2"]}})
//查询id字段不在1和2
db.集合名称.find({字段名称:{$nin:["1","2"]}})
//查询访问量大于等于1000 且小于2000的数据
db.集合名称.find({$and:[ {字段名称:{$gte:1000}} ,{字段名称:{$lt:2000} }]})
db.集合名称.find({$or:[ {字段名称:{$gte:1000}} ,{字段名称:{$lt:2000} }]})
//列值增长
db.集合名称.update({字段名称:"2"},{$inc:{visits:NumberInt(2)}})

一、.Net Core下使用Mongodb落地情况分析

1.批量添加

情况1:当客户端通过电商微服务往MongoDB中添加商品数据的时候,如果一个个添加,添加效率会比较低。如何解决添加商品添加效率低的问题?

方案:批量添加

/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("Product")]
public class ProductController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductController(IProductService productService)
    {
        _productService = productService;
    } 
    /// <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>
public class ProductService : IProductService
{
    private readonly IMongoCollection<Product> _products;

    public ProductService()
    {
        // 1、建立MongoDB连接
        var client = new MongoClient("mongodb://localhost:27017");
        // 2、获取商品库(自己创建商品数据)
        var database = client.GetDatabase("ProductDB");

        // 3、获取商品表(自己创建商品数)
        _products = database.GetCollection<Product>("Product");
     
    }

    public void CreateList(List<Product> Products)
    {
        _products.InsertMany(Products);
    }
 }

2.条件查询

分析:当客户端通过电商微服务往MongoDB中添加商品数据的时候,商品数据已经被成功添加到MongoDB中。如何从MongoDB中查询商品数据?

方案:查询商品

/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("Product")]
public class ProductController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductController(IProductService productService)
    {
        _productService = productService;
    } 
    /// <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>
public class ProductService : IProductService
{
    private readonly IMongoCollection<Product> _products;

    public ProductService()
    {
        // 1、建立MongoDB连接
        var client = new MongoClient("mongodb://localhost:27017");
        // 2、获取商品库(自己创建商品数据)
        var database = client.GetDatabase("ProductDB");

        // 3、获取商品表(自己创建商品数)
        _products = database.GetCollection<Product>("Product");
     
    }

   public Product GetProductById(string id)
        {
            return _products.Find<Product>(product => product.Id == id).FirstOrDefault();
        }
 }

3.批量查询

情况1:当客户端通过电商微服务往MongoDB中查询商品的时候,一个一个查询,效率比较低,如何实现批量查询?

方案:批量查询

/// <summary>
    /// 商品控制器
    /// </summary>
    [ApiController]
    [Route("Product")]
    public class ProductController : ControllerBase
    {
        private readonly IProductService _productService;

        public ProductController(IProductService productService)
        {
            _productService = productService;
        } 
        /// <summary>
        /// 查询商品列表
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        public ActionResult<IEnumerable<Product>> GetProducts()
        {
            return _productService.GetProducts().ToList();
        }
    }
 /// <summary>
/// 商品服务实现
/// </summary>
public class ProductService : IProductService
{
    private readonly IMongoCollection<Product> _products;

    public ProductService()
    {
        // 1、建立MongoDB连接
        var client = new MongoClient("mongodb://localhost:27017");
        // 2、获取商品库(自己创建商品数据)
        var database = client.GetDatabase("ProductDB");

        // 3、获取商品表(自己创建商品数)
        _products = database.GetCollection<Product>("Product");
     
    }

   public IEnumerable<Product> GetProducts()
        {
            return _products.Find(product => true).ToList();
        }
 }

4.分页查询

情况2:当客户端通过电商微服务往MongoDB中查询商品的时候,批量查询很多数据,由于数据量过大,导致内存直接溢出。如何防止数据量过大,导致内存溢出的问题?

方案:分页查询

/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("Product")]
public class ProductController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductController(IProductService productService)
    {
        _productService = productService;
    } 
    /// <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();
    }
}
 /// <summary>
/// 商品服务实现
/// </summary>
public class ProductService : IProductService
{
    private readonly IMongoCollection<Product> _products;

    public ProductService()
    {
        // 1、建立MongoDB连接
        var client = new MongoClient("mongodb://localhost:27017");
        // 2、获取商品库(自己创建商品数据)
        var database = client.GetDatabase("ProductDB");

        // 3、获取商品表(自己创建商品数)
        _products = database.GetCollection<Product>("Product");
     
    }

   /// <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();
        }
 }

5.数据删除

分析:当客户端通过电商微服务往MongoDB中添加商品的时候,数据量非常大,这个时候,客户端希望能够删除商品,如何删除商品?

方案:删除商品

/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("Product")]
public class ProductController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductController(IProductService productService)
    {
        _productService = productService;
    } 
    
    /// <summary>
    /// 删除商品
    /// </summary>
    /// <param name="product"></param>
    /// <returns></returns>
    [HttpDelete]
    public IActionResult DeletetProduct(Product product)
    {
        try
        {
            _productService.Delete(product);
        }
        catch (Exception)
        {
            throw;
        }

        return NoContent();
    }
}
/// <summary>
/// 商品服务实现
/// </summary>
public class ProductService : IProductService
{
    private readonly IMongoCollection<Product> _products;

    public ProductService()
    {
        // 1、建立MongoDB连接
        var client = new MongoClient("mongodb://localhost:27017");
        // 2、获取商品库(自己创建商品数据)
        var database = client.GetDatabase("ProductDB");

        // 3、获取商品表(自己创建商品数)
        _products = database.GetCollection<Product>("Product");
     
    }

   public void Delete(Product Product)
        {
            _products.DeleteOne(product => product.Id == Product.Id);
        }
 }

6.数据更新

分析:当客户端通过电商微服务往MongoDB中添加商品的时候,商品添加错误,希望能够修改商品,这个时候,客户端希望能够修改商品,如何修改商品?

方案:修改商品

/// <summary>
/// 商品控制器
/// </summary>
[ApiController]
[Route("Product")]
public class ProductController : ControllerBase
{
    private readonly IProductService _productService;

    public ProductController(IProductService productService)
    {
        _productService = productService;
    } 
    
    /// <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>
public class ProductService : IProductService
{
    private readonly IMongoCollection<Product> _products;

    public ProductService()
    {
        // 1、建立MongoDB连接
        var client = new MongoClient("mongodb://localhost:27017");
        // 2、获取商品库(自己创建商品数据)
        var database = client.GetDatabase("ProductDB");

        // 3、获取商品表(自己创建商品数)
        _products = database.GetCollection<Product>("Product");
     
    }

   		/// <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));
        }
 }
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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