(一)Mongdb作用,以及子文档的基本操作

(一)mongdb能带来那些优势,主要可以解决什么问题,缺陷是什么

优势:

1:因为是基于boson存储的,字段可以任意收缩,避免了造成了空间的浪费

2:在程序里面添加集合的时候可以自动创建集合或者字段,免去了特意的去建数据库表的步骤

3:分布式存储(hash分片,范围分片)减轻了服务器的负载压力,和提升了并发处理的能力,服务器可以不断的横向增加

4:bson形式的存储,支持子文档的存储(子文档数据量不能过大,否则就会数据很混乱),避免了取关联数据的join查询

5:对于一些不是很必要的数据进行存储,避免了不断访问数据库,造成数据库压力过大的情况

缺陷:

1:对于复杂关系查询不适合

存储形式:

1:数据是存在磁盘里面的,当获取数据的时候,就会从磁盘把数据到映射到内存,经常访问数据也会造成内存消耗加大,所以对内存和存放数据的磁盘都不能太小

(二)操作子文档

#region 修改子文档
public void Update2()//单条跟新子文档用(高效率);(修改单条子数据适合)
{
List<detail> dils = new List<detail>();
var filter = Builders<product>.Filter.Where(m => m.name == "1") & Builders<product>.Filter.Where(d => d.details.Any(r => r.yy == "3"));
var updateModel = Builders<product>.Update.Set(m => m.details[-1].ss, "sseev");
var collection = database.GetCollection<product>("product");
collection.UpdateMany(filter, updateModel);
}
public void Update3()//批量跟新所有子文档(低效率);(修改多条子数据适合)
{
var filter = Builders<product>.Filter.Where(m => m.name == "1");
var collection = database.GetCollection<product>("product");
List<product> ps = collection.Find(filter).ToList();//查询哪一条product
List<detail> dils = ps[0].details;//获取查询的那条product下面的details集合
for (int i = 0; i < dils.Count; i++)
{
if (dils[i].yy == "qwqw")
{
dils[i].ss = "994433";
}
}
var updateModel = Builders<product>.Update.Set(m => m.details, dils);
collection.UpdateMany(filter, updateModel);//filter确定修改哪个product下的detail集合
}
#endregion

 

#region 添加子文档
public void Add()//替换模式效率低(不推荐)
{
List<detail> dils = new List<detail> {
new detail{yy="1",ss="2" },
new detail{yy="3",ss="4" },
new detail{yy="5",ss="6" },
new detail{yy="7",ss="8" },
new detail{yy="qwqw",ss="r" },
new detail{yy="qwqw",ss="t" }
};
var filter = Builders<product>.Filter.Where(m => m.name == "1");
var updateModel = Builders<product>.Update.Set(m => m.details, dils);
var collection = database.GetCollection<product>("product");
collection.UpdateMany(filter, updateModel);
}
public void Add1()//向子集合插入多条数据(推荐)
{
List<detail> dils = new List<detail> {
new detail{yy="111",ss="222" }, new detail{yy="333",ss="444" }
};
var filter = Builders<product>.Filter.Where(m => m.name == "1");
var updateModel = Builders<product>.Update.PushEach(m => m.details, dils);
var collection = database.GetCollection<product>("product");
collection.UpdateMany(filter, updateModel);
}
public void Add2()//向子集合插入一条数据(推荐)
{
detail detai= new detail { yy = "HHH", ss = "MMMM" };
var filter = Builders<product>.Filter.Where(m => m.name == "1");
var updateModel = Builders<product>.Update.Push(m => m.details, detai);
var collection = database.GetCollection<product>("product");
collection.UpdateMany(filter, updateModel);
}
#endregion

 

#region 删除子文档数据
public void Delete0()//以set方式替换子集(不推荐)
{
var filter = Builders<product>.Filter.Where(m => m.name == "1");
var collection = database.GetCollection<product>("product");
List<product> ps = collection.Find(filter).ToList();
List<detail> objs = ps[0].details.Where(m => m.yy != "5").ToList();
var updateModel = Builders<product>.Update.Set(m => m.details, objs);//替换子集
collection.UpdateMany(filter, updateModel);
}
public void Delete()//按条件删除多个子元素(推荐)
{
List<detail> dils = new List<detail>();
var filter = Builders<product>.Filter.Where(m => m.name == "1") & Builders<product>.Filter.Where(d => d.details.Any(r => r.yy == "qwqw"));
var updateModel = Builders<product>.Update.PullFilter(m => m.details, r => r.yy == "qwqw");
var collection = database.GetCollection<product>("product");
collection.UpdateMany(filter, updateModel);
}
public void Delete1()//删除单个子元素(推荐)
{
var filter = Builders<product>.Filter.Where(m => m.name == "1");
var collection = database.GetCollection<product>("product");
List<product> ps = collection.Find(filter).ToList();//查询哪一条product
detail obj = ps[0].details.Where(m=>m.yy=="7").ToList()[0];//获取查product要删除的那条detail
var updateModel = Builders<product>.Update.Pull(s => s.details, obj);//删除那条detail
collection.UpdateMany(filter, updateModel);
}
#endregion

 

#region 子文档数据查询
public void GetOne() {
var filter = Builders<product>.Filter.Where(m => m.name == "1");//查询一条数据
var collection = database.GetCollection<product>("product");
detail ps = collection.Find(filter).ToList().SelectMany(s=>s.details).Where(f=>f.yy=="3").FirstOrDefault();
}
public void GetPage()
{
var filter = Builders<product>.Filter.Where(m => m.name == "1");//分页查询多条数据
var collection = database.GetCollection<product>("product");
List<detail> ps = collection.Find(filter).ToList().SelectMany(s => s.details).Skip(0).Take(2).ToList();
}

#endregion

posted @   yingxianqi  阅读(62)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示