MongoDB学习笔记~官方驱动嵌套数组对象的更新
回到目录
对于数组对象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学习笔记~官方驱动嵌套数组对象的更新相关推荐
- MongoDB学习笔记~官方驱动的原生Curd操作
回到目录 MongoDB的官方C#驱动,让我们使用起来也很方便,但对于Linq开发人员来说,可能有些不了解,所以,我还是将官方驱动进行了二次封装,而对于一个比较个性化的mongo操作,使用我封装的也很 ...
- MongoDB学习笔记(一) MongoDB介绍及安装
系列目录 MongoDB学习笔记(一) MongoDB介绍及安装 MongoDB学习笔记(二) 通过samus驱动实现基本数据操作 MongoDB学习笔记(三) 在MVC模式下通过Jq ...
- 非关系型数据库MongoDB学习笔记
MongoDB学习笔记 --周灿 创建数据库 use "databasename" 查看数据库 show dbs 给指定数据库添加集合和插入记录 db.集合名.insert({ ...
- MongoDB学习笔记【2】-- 试用
大部分内容根据MongoDB官方手册整理:http://docs.mongodb.org/manual/contents/ 查看数据库 [root@slayer ~]# mongo MongoDB s ...
- MongoDB学习笔记~对集合属性的操作
$unset清除元素 请注意在单个数组元素上使用$unset的结果可能与你设想的不一样.其结果只是将元素的值设置为null,而非删除整个元素.要想彻底删除某个数组元素,可以用$pull 和$pop操作 ...
- MongoDB学习笔记(3)- Mongo Shell 常用查询命令
MongoDB学习笔记(3)- Mongo Shell 常用查询命令 本文所使用的MongoDB版本为 4.0.10 > db.version(); 4.0.10 一.find 命令进行简查询 ...
- MongoDB学习笔记(入门)
MongoDB学习笔记(入门) 一.文档的注意事项: 1. 键值对是有序的,如:{ "name" : "stephen", "genda" ...
- JavaScript学习笔记05【高级——DOM对象】
w3school 在线教程:https://www.w3school.com.cn JavaScript学习笔记01[基础--简介.基础语法.运算符.特殊语法.流程控制语句][day01] JavaS ...
- MongoDB学习笔记(四)使用Java进行实时监控与数据收集(空间使用量、连接数)
目录: MongoDB学习笔记(一)环境搭建与常用操作 MongoDB学习笔记(二)使用Java操作MongoDB MongoDB学习笔记(三)使用Spring Data操作MongoDB Mongo ...
最新文章
- LINQ to SQL 之DataContext用法
- 阿里“三活”数据中心实践经验:没人能做,我们就自己做
- 在Outlook中修改脱机文件(.ost)的保存位置
- 磁盘及文件系统的管理
- 【Python】import自己的模块报错
- java hashmap putall_Java ConcurrentHashMap.putAll方法代码示例
- BZOJ 1180: [CROATIAN2009]OTOCI [LCT]
- spring配置redis(xml+java方式)(最底层)
- springboot+vue全栈开发_全栈的自我修养: 002使用@vue/cli进行vue环境搭建 (使用Vue,SpringBoot,Flask完成前后端分离)...
- aix 查看防火墙状态_AIX系统自带防火墙
- ape格式转换ogg格式用什么软件好
- 计算机的英语音标是什么,英语音标怎么打出来,怎样在电脑上输入英语音标?...
- 微积分(六)——一元函数微分学
- 疑问代词who和whom的用法
- 回归预测 | MATLAB实现NCA(近邻成分分析)多输入单输出
- 用python的turtle画等边三角形讲解_通过Python turtle绘制等边三角形谈编程思维和逻辑...
- 带你了解ICCV、ECCV、CVPR三大国际会议
- yarn打包报错:error during build: Error: Assigning to rvalue (Note that you need plugins to import files
- 第四章 脑功能磁共振成像
- Prometheus 监控详解
热门文章
- 打印出所有的中文字符
- Ubuntu Mysql 数据库和表的操作 [2P]
- 如何在离开页面时弹出确认对话框
- 挑选适合自己的公司——网络工程师你是否真的已经倒下(二)
- linux 增量备份镜像,【备份与恢复】合并增量备份与映像副本
- 【python教程入门学习】七夕情人节表白|Python程序员的花式表白
- python history没有定义_python – AttributeError:’Tensor’对象没有属性’_keras_history’...
- java 调用solr服务器_Solr环境搭建及IK分词的集成及solrJ的调用(一)
- Tomcat怎样将配置文件放在外部
- php根据时间搜索,yii2实现根据时间搜索的方法