回到目录

对于数组对象mongodb本身是支持的,不过对于数组的更新,mongodb的Csharp驱动目前只支持一级,即你的对象里包含数组,而数组又包括数组,这表示两层,这在更新子数组时,Csharp驱动是不支持的,今天要说的就是如何让它支持子数组的更新,下面是我给出的数据结构

在Mongodb的Csharp驱动里,一般的更新方法如下

  update = new UpdateDocument {{ "$set",       new BsonDocument("OrderList.$.UserName","占占的订单")}};mongoRepository.Collection.Update(query, update);

上面代码可以很快速的将指定的二级数组OrderList里的UserName字段更新,而如果你要更新OrderDetail就没那么容易了,Csharp驱支目前是不支持的,当然你肯定会照着葫芦画飘,但结果是失败的,就像下面的代码(失败,只有既望新版驱动了)

  update = new UpdateDocument {{ "$set",       new BsonDocument("OrderList.$.OrderDetail.ProductName","占占")}};mongoRepository.Collection.Update(query, update);

结果是OrderDetail的ProductName没有发生任何变化,呵呵。

去找原因,去找资料,还好,找到了一个不错的说法,即要想更新数组内的数组,需要将对上级数据进行定位,如OrderList.0.OrderDetail,这表示下标为0的OrderList数组元素(一个实体)下的OrderDetail数组对象,当然这个下标可不是那么轻易能得到的,

我们需要对数组进行遍历,找到满足条件的后,进行break即可。

var mongoRepository = new MongoDB.Data.Core.MongoOfficialRepository<Person>();var query = Query.EQ("OrderList._id", twoID);var oo = mongoRepository.Collection.Find(query).FirstOrDefault();var update = new UpdateDocument();bool isExit = false;for (int j = 0; j < oo.OrderList.Count; j++){var od = oo.OrderList[j].OrderDetail;oo.OrderList[j].UserName = "大占占改呀";for (int i = 0; i < od.Count; i++){if (od[i].Id == threeID){od[i].ProductName = "大占占修改了订单21";#region 先pull,再push//update = new UpdateDocument {{ "$pull", //                                    new BsonDocument("OrderList."+j+".OrderDetail",//                                    new BsonDocument("_id",threeID))//                                 }};//mongoRepository.Collection.Update(query1, update);//update = new UpdateDocument {{ "$push", //                                 new BsonDocument("OrderList."+j+".OrderDetail",//                                 new BsonDocument(od[i].ToDictionary()))//                            }};//mongoRepository.Collection.Update(query1, update);#endregion#region 直接setupdate = new UpdateDocument {{ "$set",       new BsonDocument("OrderList.$.UserName",oo.OrderList[j].UserName)}};mongoRepository.Collection.Update(query, update);update = new UpdateDocument {{ "$set", new BsonDocument("OrderList."+j+".OrderDetail."+i,new BsonDocument(od[i].ToDictionary()))}};mongoRepository.Collection.Update(query, update);#endregionisExit = true;break;}}if (isExit)break;}

上面的代码,我们看到了有两种更新集合的方法,$pull和$push方法及$set方法,大家可以根据喜好进行选择,都可以实现我们的目的,ToDictionary是我封装的方法,意思是将类对象里的属性转换为字典,并做了mongodb的_id主键的处理,代码如下

/// <summary>/// 将对象属性转换为字典/// </summary>/// <param name="o"></param>/// <returns></returns>public static Dictionary<String, Object> ToDictionary(this object o){Dictionary<String, Object> map = new Dictionary<string, object>();Type t = o.GetType();PropertyInfo[] pi = t.GetProperties(BindingFlags.Public | BindingFlags.Instance);foreach (PropertyInfo p in pi){MethodInfo mi = p.GetGetMethod();if (mi != null && mi.IsPublic){if (p.Name == "Id")map.Add("_id", mi.Invoke(o, new Object[] { }));elsemap.Add(p.Name, mi.Invoke(o, new Object[] { }));}}return map;}}

对于mongodb的探索,还在继续...

回到目录

MongoDB学习笔记~官方驱动嵌套数组对象的更新相关推荐

  1. MongoDB学习笔记~官方驱动的原生Curd操作

    回到目录 MongoDB的官方C#驱动,让我们使用起来也很方便,但对于Linq开发人员来说,可能有些不了解,所以,我还是将官方驱动进行了二次封装,而对于一个比较个性化的mongo操作,使用我封装的也很 ...

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

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

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

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

  4. MongoDB学习笔记【2】-- 试用

    大部分内容根据MongoDB官方手册整理:http://docs.mongodb.org/manual/contents/ 查看数据库 [root@slayer ~]# mongo MongoDB s ...

  5. MongoDB学习笔记~对集合属性的操作

    $unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...

  6. MongoDB学习笔记(3)- Mongo Shell 常用查询命令

    MongoDB学习笔记(3)- Mongo Shell 常用查询命令 本文所使用的MongoDB版本为 4.0.10 > db.version(); 4.0.10 一.find 命令进行简查询 ...

  7. MongoDB学习笔记(入门)

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

  8. JavaScript学习笔记05【高级——DOM对象】

    w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...

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

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

最新文章

  1. LINQ to SQL 之DataContext用法
  2. 阿里“三活”数据中心实践经验:没人能做,我们就自己做
  3. 在Outlook中修改脱机文件(.ost)的保存位置
  4. 磁盘及文件系统的管理
  5. 【Python】import自己的模块报错
  6. java hashmap putall_Java ConcurrentHashMap.putAll方法代码示例
  7. BZOJ 1180: [CROATIAN2009]OTOCI [LCT]
  8. spring配置redis(xml+java方式)(最底层)
  9. springboot+vue全栈开发_全栈的自我修养: 002使用@vue/cli进行vue环境搭建 (使用Vue,SpringBoot,Flask完成前后端分离)...
  10. aix 查看防火墙状态_AIX系统自带防火墙
  11. ape格式转换ogg格式用什么软件好
  12. 计算机的英语音标是什么,英语音标怎么打出来,怎样在电脑上输入英语音标?...
  13. 微积分(六)——一元函数微分学
  14. 疑问代词who和whom的用法
  15. 回归预测 | MATLAB实现NCA(近邻成分分析)多输入单输出
  16. 用python的turtle画等边三角形讲解_通过Python turtle绘制等边三角形谈编程思维和逻辑...
  17. 带你了解ICCV、ECCV、CVPR三大国际会议
  18. yarn打包报错:error during build: Error: Assigning to rvalue (Note that you need plugins to import files
  19. 第四章 脑功能磁共振成像
  20. Prometheus 监控详解

热门文章

  1. 打印出所有的中文字符
  2. Ubuntu Mysql 数据库和表的操作   [2P]
  3. 如何在离开页面时弹出确认对话框
  4. 挑选适合自己的公司——网络工程师你是否真的已经倒下(二)
  5. linux 增量备份镜像,【备份与恢复】合并增量备份与映像副本
  6. 【python教程入门学习】七夕情人节表白|Python程序员的花式表白
  7. python history没有定义_python – AttributeError:’Tensor’对象没有属性’_keras_history’...
  8. java 调用solr服务器_Solr环境搭建及IK分词的集成及solrJ的调用(一)
  9. Tomcat怎样将配置文件放在外部
  10. php根据时间搜索,yii2实现根据时间搜索的方法