$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学习笔记~对集合属性的操作相关推荐

  1. PHP操作MongoDB学习笔记

    PHP操作MongoDB技術總結 <?php /** * PHP操作MongoDB学习笔记 */ //************************* //**   连接MongoDB数据库  ...

  2. NetLogo学习笔记3 —— 集合操作与生命游戏

    NetLogo学习笔记3 -- 集合操作与生命游戏 (这篇新知识点略多) 上一篇文章我们了解NetLogo模型的基本要素,学习了函数定义与ask语法.并编写了我们的第一个程序! 这一次,我们来编写一个 ...

  3. MongoDB学习笔记(一) MongoDB介绍及安装

    系列目录 MongoDB学习笔记(一) MongoDB介绍及安装     MongoDB学习笔记(二) 通过samus驱动实现基本数据操作     MongoDB学习笔记(三) 在MVC模式下通过Jq ...

  4. MongoDB 学习笔记八 复制、分片、备份与恢复、监控

    MongoDB 学习笔记八 复制.分片.备份与恢复.监控 MongoDB复制(副本集) 什么是复制? MongoDB 复制原理 MongoDB 副本集设置 副本集添加成员 MongoDB 分片 分片 ...

  5. 非关系型数据库MongoDB学习笔记

    MongoDB学习笔记   --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...

  6. MongoDB学习笔记(入门)

    MongoDB学习笔记(入门) 一.文档的注意事项: 1.  键值对是有序的,如:{ "name" : "stephen", "genda" ...

  7. MySQL学习笔记05【多表操作、三大范式、数据库的备份和还原】

    MySQL 文档-黑马程序员(腾讯微云):https://share.weiyun.com/RaCdIwas 1-MySQL基础.pdf.2-MySQL约束与设计.pdf.3-MySQL多表查询与事务 ...

  8. MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)

    目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...

  9. MongoDB学习笔记(四)--索引 性能优化

    索引                                                                                             基础索引 ...

最新文章

  1. 算法笔记之回溯法(2)
  2. 【Linux系统编程】线程与进程的比较
  3. 了解Logstash输入插件
  4. 在java中goto是意思,关于Java中的goto语句
  5. (1).数据结构概述
  6. 锦标赛排序、洪水填充算法、平衡规划
  7. Java内存模型(Java Memory Model,简称JMM)
  8. 例子---PHP与Form表单之二
  9. 跳打开hdu 1208 (DP)
  10. Atitit. 状态模式(State)attilax 总结 跟个策 略模式的区别
  11. 航空公司VIP客户查询
  12. 编写c语言程序实现如下功能 创建父子进程,青岛理工大学操作系统实验指导及实验报告.doc...
  13. Kubuntu 22.04的安装及基本配置(语言、分辨率自适应等)
  14. mysql源代码_MySQL源代码解读(一)
  15. 写一个函数,将一个字符串中的元音字母复制到另一字符串,然后输出。
  16. android爱汽车破解密码,汽车报价大全app sign解密过程
  17. C语言编周期100ms的方波信号,单片机系统设计 - 2020学年春(邸志刚)-中国大学mooc-题库零氪...
  18. Python数据分析入门笔记4——数据预处理之重复值
  19. 随笔,总结2020年AI在制造业领域的磕磕碰碰
  20. 敏涵化妆品何以圈粉Z世代消费群体?

热门文章

  1. 自动代理老是自动打开上不了网的解决办法
  2. java文件读写之Channel策略
  3. 网络安全学习第4篇-使用特征码和MD5对勒索病毒进行专杀,并对加密文件进行解密
  4. 怎么会是lucene?
  5. echarts给柱状图某个柱子设置颜色
  6. [NLP] 秒懂词向量Word2vec的本质+word2vec资源总结
  7. ChunJun 1.16 Release版本即将发布,bug 捉虫活动邀您参与!
  8. android 状态栏wifi,【技术贴】教你修改状态栏里的wifi、信号、电量图标(转自论坛)...
  9. redis expire方式设置缓存时间的坑
  10. vue-baidu-map添加覆盖物-点