MongoDB学习笔记~对集合属性的操作
$unset清除元素
请注意在单个数组元素上使用$unset的结果可能与你设想的不一样。其结果只是将元素的值设置为null,而非删除整个元素。要想彻底删除某个数组元素,可以用$pull 和$pop操作符。
$addToSet和$push的区别
该两者的功能都是给数组添加一个值。但是两者之间有区别,$addToSet要添加的值如果不存在才进行添加操作,但是push只添加一个值;例如:
tags = [“zzl”,”dudu”]
如果执行db.collection.update({},{$push:{tag:"laozhao"}}) 结果就是 [“laozhao”,”zzl”,“dudu”]
如果执行db.collection.update({},{$addToSet:{tag:"zzl"}}) 结果不变
关于Update.Combine集合更新注意点
对于Update.Combine我们可以把需要更新的字段合并到列表List<UpdateDefinition<T>>()中,最后一起进行更新,而这对于集合属性来说,需要注意一下,我们需要为集合属性元素使用PushEach进行添加,而不是Push,因为使用Push会将前一个元素覆盖掉,而只保留最后的元素(集合里的),所以需要使用PushEach来代替它,代码如下:
[TestMethod]public void Push(){var filter = Builders<Dog>.Filter.Eq(i => i.Id, "5850b0bdebb91a3184f90d3d");//更新所需要的字段var updateList = new List<UpdateDefinition<Dog>>();//更新需要集合类型的字段var dogHistoryList = new List<DogHistory>();//添加元素到集合属性dogHistoryList.Add(new DogHistory{HistoryName = "四虎子3",IsHealth = false,Adderss = new Adderss("广东", "深圳", "沿海")});dogHistoryList.Add(new DogHistory{HistoryName = "四虎子4",IsHealth = false,Adderss = new Adderss("广东", "深圳", "沿海")});//将需要更新集合对象添加到updateList里updateList.Add(Builders<Dog>.Update.PushEach(i => i.DogHistory, dogHistoryList));MongoDbClient.MongoManager<Dog>.Instance.UpdateOne(filter,Builders<Dog>.Update.Combine(updateList));}
Update仓储的优化
大叔对于这一点,也把它封装到了Lind.DDD.Repositories.Mongo的仓储里,完善了Update操作,修改了之前的递归处理逻辑,代码反而更简洁了,原理就是使用$set直接把原数据覆盖即可。
/// <summary>/// 版本二:递归构建Update操作串/// 主要功能:实现List子属性的push操作/// </summary>/// <param name="fieldList"></param>/// <param name="property"></param>/// <param name="propertyValue"></param>/// <param name="item"></param>/// <param name="father"></param>private void GenerateRecursionSet(List<UpdateDefinition<TEntity>> fieldList,PropertyInfo property,object propertyValue,TEntity item,string father){//复杂类型if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && propertyValue != null){//集合if (typeof(IList).IsAssignableFrom(propertyValue.GetType())){var arr = propertyValue as IList;if (arr != null && arr.Count > 0){if (string.IsNullOrWhiteSpace(father))fieldList.Add(Builders<TEntity>.Update.Set(property.Name, arr));elsefieldList.Add(Builders<TEntity>.Update.Set(father + "." + property.Name, arr));}}//实体else{foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)){if (string.IsNullOrWhiteSpace(father))GenerateRecursionSet(fieldList, sub, sub.GetValue(propertyValue), item, property.Name);elseGenerateRecursionSet(fieldList, sub, sub.GetValue(propertyValue), item, father + "." + property.Name);}}}//简单类型else{if (property.Name != EntityKey)//更新集中不能有实体键_id {if (string.IsNullOrWhiteSpace(father))fieldList.Add(Builders<TEntity>.Update.Set(property.Name, propertyValue));elsefieldList.Add(Builders<TEntity>.Update.Set(father + "." + property.Name, propertyValue));}}}
对于产生的结果是我们可以接受的,可以对集合属性很方便的实现更新了。
dog.Des.Worker = new string[] { "engineer", "coder" };dog.Des.Address = new List<Adderss>{new Adderss("beijing","fangshan","liangxiang",new string[]{"zhaojiaogan","Road100","No.300"}),new Adderss("北京","大兴","西红门",new string[]{"理想城","大满贯","4号楼"}),}
产生的结果如下
以上数据结构应该算是比较复杂的了,像实体里有子实体,然后子实体里有集合,集合里又有数组,但我封装的更新还是都适用的,这点已经做过测试,请放心使用!
欢迎大家继续关注mongodb技术!
继续关注大叔博客!
本文转自博客园张占岭(仓储大叔)的博客,原文链接:MongoDB学习笔记~对集合属性的操作,如需转载请自行联系原博主。
MongoDB学习笔记~对集合属性的操作相关推荐
- PHP操作MongoDB学习笔记
PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //** 连接MongoDB数据库 ...
- NetLogo学习笔记3 —— 集合操作与生命游戏
NetLogo学习笔记3 -- 集合操作与生命游戏 (这篇新知识点略多) 上一篇文章我们了解NetLogo模型的基本要素,学习了函数定义与ask语法.并编写了我们的第一个程序! 这一次,我们来编写一个 ...
- MongoDB学习笔记(一) MongoDB介绍及安装
系列目录 MongoDB学习笔记(一) MongoDB介绍及安装 MongoDB学习笔记(二) 通过samus驱动实现基本数据操作 MongoDB学习笔记(三) 在MVC模式下通过Jq ...
- MongoDB 学习笔记八 复制、分片、备份与恢复、监控
MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...
- 非关系型数据库MongoDB学习笔记
MongoDB学习笔记 --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...
- MongoDB学习笔记(入门)
MongoDB学习笔记(入门) 一.文档的注意事项: 1. 键值对是有序的,如:{ "name" : "stephen", "genda" ...
- MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】
MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...
- MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)
目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...
- MongoDB学习笔记(四)--索引 性能优化
索引 基础索引 ...
最新文章
- 算法笔记之回溯法(2)
- 【Linux系统编程】线程与进程的比较
- 了解Logstash输入插件
- 在java中goto是意思,关于Java中的goto语句
- (1).数据结构概述
- 锦标赛排序、洪水填充算法、平衡规划
- Java内存模型(Java Memory Model,简称JMM)
- 例子---PHP与Form表单之二
- 跳打开hdu 1208 (DP)
- Atitit. 状态模式(State)attilax 总结 跟个策 略模式的区别
- 航空公司VIP客户查询
- 编写c语言程序实现如下功能 创建父子进程,青岛理工大学操作系统实验指导及实验报告.doc...
- Kubuntu 22.04的安装及基本配置(语言、分辨率自适应等)
- mysql源代码_MySQL源代码解读(一)
- 写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
- android爱汽车破解密码,汽车报价大全app sign解密过程
- C语言编周期100ms的方波信号,单片机系统设计 - 2020学年春(邸志刚)-中国大学mooc-题库零氪...
- Python数据分析入门笔记4——数据预处理之重复值
- 随笔,总结2020年AI在制造业领域的磕磕碰碰
- 敏涵化妆品何以圈粉Z世代消费群体?
热门文章
- 自动代理老是自动打开上不了网的解决办法
- java文件读写之Channel策略
- 网络安全学习第4篇-使用特征码和MD5对勒索病毒进行专杀,并对加密文件进行解密
- 怎么会是lucene?
- echarts给柱状图某个柱子设置颜色
- [NLP] 秒懂词向量Word2vec的本质+word2vec资源总结
- ChunJun 1.16 Release版本即将发布,bug 捉虫活动邀您参与!
- android 状态栏wifi,【技术贴】教你修改状态栏里的wifi、信号、电量图标(转自论坛)...
- redis expire方式设置缓存时间的坑
- vue-baidu-map添加覆盖物-点