设为首页 收藏本站
查看: 952|回复: 0

[经验分享] MongoDB学习笔记~对集合属性的操作

[复制链接]

尚未签到

发表于 2017-12-16 07:33:51 | 显示全部楼层 |阅读模式
  回到目录

$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));
  
else
  
fieldList.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);
  
else
  
GenerateRecursionSet(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));
  
else
  
fieldList.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技术!
  继续关注大叔博客!
  回到目录

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-424590-1-1.html 上篇帖子: 解决 mongodb $in needs an array 问题 下篇帖子: MongoDB学习笔记三
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表