C# Mongo DB 修改嵌套集合中的字段

虽然c#的mongo 驱动很强大,而且还支持linq,但是一些复杂的操作语句还是比较困难

这里我用Bson实现功能

  • 这是模型(我这里有多层嵌套)

    1. public class CtStreetPurpose
    2. {
    3.  
    4. public long Id { get; set; }
    5.  
    6. public List<StreetPurpose> StreetPurposes { get; set; }
    7. }
    8.  
    9. public class StreetPurpose
    10. {
    11. public long BuyerId { get; set; }
    12.  
    13. public string Remark { get; set; }
    14.  
    15. public string RemarkName { get; set; }
    16.  
    17. public List<PurposeStreetId> StreetIds { get; set; }
    18.  
    19. public string PurposeCategory { get; set; }
    20.  
    21. public int Top { get; set; }
    22.  
    23. public string Content { get; set; }
    24.  
    25. public long FollowTime { get; set; }
    26.  
    27. public long UpdateTime { get; set; }
    28. }
    29.  
    30. public class PurposeStreetId
    31. {
    32.  
    33. public long Id { get; set; }
    34.  
    35. public long StreetId { get; set; }
    36. }
    37.   

  

直接上代码

  1. public async Task UpdateStreetPurpose(CtStreetPurpose create)
  2. {
  3.  
  4. var writeModels = new List<WriteModel<CtStreetPurpose>>();

  5. foreach (var purpose in create.StreetPurposes)
  6. {
    //过滤条件
  7. var filter = new BsonDocument
  8. {
  9. {"_id",create.Id},//在monogo db 里面id是_id
    //第一层嵌套中的字段过滤
  10. {
  11. "StreetPurposes",new BsonDocument
  12. {
  13. {"$elemMatch",new BsonDocument{{ "BuyerId", purpose.BuyerId}}}
  14. }
  15. },
  16. };
  17.  
  18. //构建一个bson数组存放需要插入集合的数据
  19. var streetIdsBsonArray = new BsonArray();
  20. foreach (var streetIds in purpose.StreetIds)
  21. {
  22. var streetIdsBson = new BsonDocument
  23. {
  24. {"_id", streetIds.Id},
  25. {nameof(PurposeStreetId.StreetId), streetIds.StreetId}
  26. };
  27. streetIdsBsonArray.Add(streetIdsBson);
  28. }
  29.  
  30. //更新
  31. var update = new BsonDocument
  32. {
  33. {
    //插入集合
  34. "$push",new BsonDocument
  35. {
  36. {
    //如果不是插入集合--这里需要修改
  37. "StreetPurposes.$.StreetIds",new BsonDocument
  38. {
  39. {"$each",streetIdsBsonArray}
  40. }
  41. }
  42. }
  43. }
  44. };
  45.  
  46. writeModels.Add(new UpdateManyModel<CtStreetPurpose>(filter, update) { IsUpsert = true }); // IsUpsert--强制更新
  1. }
  2.  
  3. await collection.BulkWriteAsync(session, writeModels);
    }

第一次写问随笔没什么经验 ^ - ^

C# Mongo DB 修改多层嵌套集合中的字段的更多相关文章

  1. iOS开发-多层嵌套block中如何使用__weak和__strong

    1.关于__weak__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)__weak修饰的对象在block中不可以被重新赋值.__weak ...

  2. JsonPath:从多层嵌套Json中解析所需要的值

    问题 应用中,常常要从嵌套的JSON串中解析出所需要的数据.通常的做法是,先将JSON转换成Map, 然后一层层地判空和解析.可使用 JsonPath 来解决这个问题. 给定一个 JSON 串如下所示 ...

  3. 增强 用文本增强修改SAP标准屏幕中的字段名称 属于元素的文本增强

    如果想要改变标准屏幕中的字段名称,如把物料主数据基本数据元素的名字改为我们想要的名字 . 1.首先,事务MM03进入物料主数据的基本数据2视图中,将鼠标光标放在需要更改的字段“页格式”上,然后按F1键 ...

  4. java多层嵌套集合的json,如何获取多层集合中所需要的value

    就很简单的一个问题折磨了整整一天,好在压抑的心情终于释放了,终于闲下来觉得是不是应该记录一下. 首先这个json串是从外网接口返回的数据,想要了解的朋友们可以复制到json解析器中看一下格式:http ...

  5. list集合中指定字段去重

    在开发中,有时会需要指定字段去重,以下为实现方法: 假设有个房地产权的类,其中宗地代码ZDDM值重复,而我们在前端页面显示时,只需要一条数据,因为公共字段都一样: IEqualityComparer需 ...

  6. log4j打印错误日志输出 利用sql取出的值放在list集合中,集合中的字段类型为映射类类型

    public ServiceResult<List<KefuDetail>> MaxRespondtime(Date startDate,Date endDate, Strin ...

  7. ajaxGird修改一条记录中的字段

    var rowData = ajaxgrid.getSelectedRow(); var quality = rowData["quality"]; var rowIndex = ...

  8. Mongo DB 2.6 需要知道的一些自身限定

    在现实的世界中,任何事情都有两面性,在程序的世界中,亦然! 我们不论是在使用一门新的语言,还是一门新的技术,在了解它有多么的让人兴奋,让人轻松,多么的优秀之余,还是很有必要了解一些他的局限性,方便你在 ...

  9. pythong中的全局变量的调用和嵌套函数中变量的使用

    全局变量调用:想要在自定义的函数中使用全局变量,就得要在函数用关键字global声明,然后就可以对全局变量进行修改.嵌套函数中的变量的调用:要在嵌套的变量中,使用nonlocal的声明'''num = ...

随机推荐

  1. Python while 中简单的语句组

    Python while 中简单的语句组: 只使用 while: # 简单的语句组 a = 4 b = 8 num = 0 while a < b: print("a 比 b 小&qu ...

  2. Django学习路34_models 文件创建数据表

    from django.db import models # Create your models here. class BookInfoManager(models.Manager): '''图书 ...

  3. PHP jdmonthname() 函数

    ------------恢复内容开始------------ 实例 返回 1998 年 1 月 13 日这天的格利高里历法的月份简写字符串: <?php$jd=gregoriantojd(1,1 ...

  4. 使用VMware虚拟机建立Ubuntu与主机win7的文件共享与传输

    1.要想在虚拟机与主机之间建立共享文件夹必须先安装VMware Tools.方法见https://www.cnblogs.com/lsc666js/p/13403919.html. 2.在VMware ...

  5. 【NOI2010】超级钢琴 题解(贪心+堆+ST表)

    题目链接 题目大意:求序列内长度在$[L,R]$范围内前$k$大子序列之和. ---------------------- 考略每个左端点$i$,合法的区间右端点在$[i+L,i+R]$内. 不妨暴力 ...

  6. Python解决网吧收费系统,远控网吧电脑设备!

    python破解网吧收费系统,远控网吧电脑设备! 很多人学习python,不知道从何学起.很多人学习python,掌握了基本语法过后,不知道在哪里寻找案例上手.很多已经做案例的人,却不知道如何去学习更 ...

  7. 用Python绘制一套“会跳舞”的动态图形给你看看

    在读技术博客的过程中,我们会发现那些能够把知识.成果讲透的博主很多都会做动态图表.他们的图是怎么做的?难度大吗?这篇文章就介绍了 Python 中一种简单的动态图表制作方法. 看这优美的舞姿 很多人学 ...

  8. URLDecoder异常解决方法

    URLDecoder对参数进行解码时候,代码如: URLDecoder.decode(param,"utf-8"); 有时候会出现类似如下的错误: URLDecoder异常Ille ...

  9. spring boot 中使用spring security阶段小结

    1 项目结构图 2 AnyUserDetailsService package com.fengyntec.config; import com.fengyntec.entity.UserEntity ...

  10. Spring Boot打包瘦身 Docker 使用全过程 动态配置、日志记录配置

    springBoot打包的时候代码和jar包打包在同一个jar包里面,会导致jar包非常庞大,在不能连接内网的时候调试代码,每次只改动了java代码就需要把所有的jar包一起上传,导致传输文件浪费了很 ...