博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB学习笔记~Update方法更新集合属性后的怪问题
阅读量:6939 次
发布时间:2019-06-27

本文共 4142 字,大约阅读时间需要 13 分钟。

在对MongoDB进行封装后,对于Update更新对象里的集合属性时出现了一个现象,让人感到很恶心,人家更新前是个美丽的Array,但是更新之后集合对象变成了键值对,键是集合的类型名称,值是真实的数组值,哈哈,这个问题起初困扰了我很久,今天终于豁然开朗了,原来是Update方法的问题,呵呵!

看原来的值

看更新后的变质的值

再看看我们的Update方法

public Task UpdateAsync(TEntity item)        {            var query = new QueryDocument("_id", typeof(TEntity).GetProperty(EntityKey).GetValue(item).ToString());            var fieldList = new List
>(); foreach (var property in typeof(TEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (property.Name != EntityKey)//更新集中不能有实体键_id { fieldList.Add(Builders
.Update.Set(property.Name, property.GetValue(item))); } } return ForWait(() => _table.UpdateOneAsync(query, Builders
.Update.Combine(fieldList))); }

确实没看出什么问题来,但最后它生成的代码是以_t和_v为键值的值,出现这种情况的原因是你的代码没有被mongo识别,就像之前我们为mongo传decimal类型的数据一样,它也会出现同样的情况。

解决方法

将复杂类型进行拆封和组装,让它被mongo所认识,这样update操作就可以按着我们预想的完成了,值得注意的是,如果你的对象里有复杂类型,如Person类里有Address类型,那么在赋值时我们拼成以下这样

Address.City="北京"

而如果你的对象里属性为集合类型,那就更麻烦一些,除了做上面的拆封外,还要关注它的索引号,如Person类里有AddList集合属性,那么在赋值时我们拼成以下这样

AddList.0.City="北京"

下面公开大叔的Update代码

public Task UpdateAsync(TEntity item)        {            var query = new QueryDocument("_id", typeof(TEntity).GetProperty(EntityKey).GetValue(item).ToString());            var fieldList = new List
>(); foreach (var property in typeof(TEntity).GetProperties(BindingFlags.Instance | BindingFlags.Public)) { //非空的复杂类型 if (property.PropertyType.IsClass && property.PropertyType != typeof(string) && property.GetValue(item) != null) { if (typeof(IList).IsAssignableFrom(property.PropertyType)) { #region 集合类型 foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { if (sub.PropertyType.IsClass && sub.PropertyType != typeof(string)) { var arr = property.GetValue(item) as IList; if (arr != null && arr.Count > 0) { for (int s = 0; s < arr.Count; s++) { foreach (var subInner in sub.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { //propertyName.index.innerPropertyName fieldList.Add(Builders
.Update.Set(property.Name + "."+ s + "." + subInner.Name, subInner.GetValue(arr[s]))); } } } } } #endregion } else { #region 实体类型 //复杂类型,导航属性,类对象和集合对象 foreach (var sub in property.PropertyType.GetProperties(BindingFlags.Instance | BindingFlags.Public)) { fieldList.Add(Builders
.Update.Set(property.Name + "." + sub.Name, sub.GetValue(property.GetValue(item)))); } #endregion } } else //简单类型 { if (property.Name != EntityKey)//更新集中不能有实体键_id { fieldList.Add(Builders
.Update.Set(property.Name, property.GetValue(item))); } } } return ForWait(() => _table.UpdateOneAsync(query, Builders
.Update.Combine(fieldList))); }

希望本文章对使用MongoDB的学生来说有所帮助!

 

转载于:https://www.cnblogs.com/lori/p/4538550.html

你可能感兴趣的文章
vuejs 1.x - 实例:搜索过滤
查看>>
将PostgreSQL数据库扩展到每个月12亿条记录的经验教训
查看>>
Instana发布微服务应用程序样例
查看>>
京东Vue组件库NutUI 2.0发布:将支持跨平台!
查看>>
新书问答:Agile Management
查看>>
Apache HBase的现状和发展
查看>>
LinkedIn工程经理眼中的数据世界格局
查看>>
Servlet续篇
查看>>
AWS开源Firecracker,一种运行多租户容器服务的新虚拟化技术
查看>>
PHP扩展库PEAR被攻击,近半年下载者或被影响
查看>>
企业微信自建应用开发初探
查看>>
O’Reilly发布“微服务成熟度状态”报告:微服务是成功的
查看>>
Submarine:在 Apache Hadoop 中运行深度学习框架
查看>>
《Clojure Recipes》书评与问答
查看>>
腾讯集团与光大集团签署战略合作 共建金融科技创新实验室
查看>>
怀疑在软件测试中所起的作用
查看>>
5G一周热闻:华为夺联通5G大单,首张5G电话卡发放
查看>>
2018年Github最受欢迎机器学习语言Python稳坐冠军,numpy、scipy是最受欢迎软件包...
查看>>
GitHub 重磅更新:无限私有仓库免费使用
查看>>
“10%时间”:优点和缺点——敏捷海滩会议上Elizabeth Pope的报告
查看>>