【愚公系列】2022年05月 .NET架构班 058-分布式中间件 .Net Core下使用Mongodb增删改查
【摘要】 前言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)