c#实现 Mongodb存储【文档局部更新】

如下:

递归更新字段  ,构建UpdateDefinition

  1.  
    /// <summary>
  2.  
    /// 构建更新操作定义
  3.  
    /// </summary>
  4.  
    /// <param name="bc">bsondocument文档</param>
  5.  
    /// <returns></returns>
  6.  
    private List<UpdateDefinition<BsonDocument>> BuildUpdateDefinition(BsonDocument bc, string parent )
  7.  
    {
  8.  
    var updates = new List<UpdateDefinition<BsonDocument>>();
  9.  
    foreach (var element in bc.Elements)
  10.  
    {
  11.  
    var key = parent == null ? element.Name : $"{parent}.{element.Name}";
  12.  
    var subUpdates = new List<UpdateDefinition<BsonDocument>>();
  13.  
    //子元素是对象
  14.  
    if (element.Value.IsBsonDocument)
  15.  
    {
  16.  
    updates.AddRange(BuildUpdateDefinition(element.Value.ToBsonDocument(), key));
  17.  
    }
  18.  
    //子元素是对象数组
  19.  
    else if (element.Value.IsBsonArray)
  20.  
    {
  21.  
    var arrayDocs = element.Value.AsBsonArray;
  22.  
    var i = 0;
  23.  
    foreach (var doc in arrayDocs)
  24.  
    {
  25.  
    if (doc.IsBsonDocument)
  26.  
    {
  27.  
    updates.AddRange(BuildUpdateDefinition(doc.ToBsonDocument(), key + $".{i}"));
  28.  
    }
  29.  
    else
  30.  
    {
  31.  
    updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
  32.  
    continue;
  33.  
    }
  34.  
    i++;
  35.  
    }
  36.  
    }
  37.  
    //子元素是其他
  38.  
    else
  39.  
    {
  40.  
    updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
  41.  
    }
  42.  
    }
  43.  
    return updates;
  44.  
    }

注意其中key的构建,针对文档包含的子文档,需要对其key添加到根节点的路径。针对包含文档数组的,需要添加下标,指定到对应的标签进行数据的更新。

调用更新操作,更新多份文档操作如下:

  1.  
    /// <summary>更新</summary>
  2.  
    public async Task<IEnumerable<string>> UpdateAsync(MetadataCollection metadatas)
  3.  
    {
  4.  
    List<string> result = null;
  5.  
    var kmds = metadatas.Select(e => e.As<Metadata>()).ToList();
  6.  
    var docs = kmds.ConvertAll(DicConvertToBsonDoc);
  7.  
    var updateOptions = new UpdateOptions { IsUpsert = true };
  8.  
    try
  9.  
    {
  10.  
    foreach (var doc in docs)
  11.  
    {
  12.  
    var filter = Builders<BsonDocument>.Filter.Eq(f => f[iiid], doc[iiid]);
  13.  
    var update = Builders<BsonDocument>.Update.Combine(BuildUpdateDefinition(doc,null));
  14.  
    await _access.UpdateAsync(filter, update, updateOptions);
  15.  
    }
  16.  
    result = metadatas.Select(s => s.IIId).ToList();
  17.  
    }
  18.  
    catch (Exception ex)
  19.  
    {
  20.  
    IndexExceptionCodes.UpdatingIndexFailed.ThrowUserFriendly(ex.Message, "更新索引失败");
  21.  
    }
  22.  
    return result;
  23.  
    }

其中,先将给定的模型列表转化为Mongodb的文档对象BsonDocument,然后执行更新操作。指定操作如果key不存在执行插入操作。

示例如下:

Step1:查看原文档

Step2:执行更新操作

Step3:查看更新之后的结果

参考如下:

MongoDB更新包含对象数组的元素: 使用mongodb中数组元素的下标来做更新(update)多维数组 例如有如下数据结构: {   "_id":ObjectId("4b97e62bf1d8c7152c9ccb74"),   ”comments“:[     {     "by":"joe",     "votes":3,     "replies":[                 {"by":"jane",                 "votes":2                }]      }]   }   如果要将"replies"中{“by”:"jane"}的投票数增加1,该如何做呢?
mongodb使用多维数组下标的方式来定位某个元素
先find({"comments.replies.by":"jane"})来获取到整个object, 然后计算相应reply的数组下标, 再使 用update({"comments.0.replies.0.by":"jane"},{"$inc", {"comments.0.replies.0.votes":1}})

MongoDB——更新操作(Update)c#实现的更多相关文章

  1. MySQL 的更新操作update

    1 更新操作(单表更新) 1)单表更新 update [low_priority] [ignore] table_reference set col_name1={expr1|default},col ...

  2. 事务处理操作(COMMIT,ROLLBACK)。复制表。更新操作UPDATE实际工作中一般都会有WHERE子句,否则更新全表会影响系统性能引发死机。

    更新操作时两个会话(session)同时操作同一条记录时如果没有事务处理操作(COMMIT,ROLLBACK)则会导致死锁. 复制表:此方法Oracle特有

  3. Hive扩展功能(九)--Hive的行级更新操作(Update)

    软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...

  4. mongodb更新操作

    除了查询条件,还可以使用修改器对文档进行更新. 1. $inc > db.tianyc03.find() { "_id" : ObjectId("50ea6b6f1 ...

  5. [转]MongoDB更新操作replaceOne()实例讲解

    最近正在学习MongoDB,作为数据库的学习当然是要从CRUD开始学起了.这篇文章默认读者是知道如何安装MongoDB.如何运行MongoDB实例以及了解了MongoDB中的collection.do ...

  6. mongodb 更新操作

    db.aaaa.update({},{$push:{money:{$each:[8,9,10],$slice:-4}}}) db.aaaa.update({},{$addToSet:{money:{$ ...

  7. MongoDB 文档的更新操作

    在MongoDB中,更新单个doc的操作是原子性的.默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的 ...

  8. java操作mongodb——更新数据

    Java中可以通过updateOne,updateMany,replaceOne方法进行集合的文档更新.但是 _id 是不能更新的 updateOne只会更新一条数据,即使通过Filters.lt(& ...

  9. mongodb批量更新操作文档的数组键

    persons文档的数据如下: > db.persons.find(){ "_id" : 2, "name" : 2 }{ "_id" ...

随机推荐

  1. QList 列表指针的 释放

    1,使用qDeleteAll() QList<T*> list: qDeleteAll(list): list = NULL; QList<T*> *listp: qDelet ...

  2. C++ 泛型 编写的 数据结构 栈

    平时编程里经常需要用到数据结构,比如  栈和队列 等,  为了避免每次用到都需要重新编写的麻烦现将  C++ 编写的 数据结构   栈   记录下来,以备后用. 将 数据结构  栈   用头文件的形式 ...

  3. 关于self和super在oc中的疑惑与分析 (self= [super init])

    这个问题貌似很初级,但很容易让人忽略,me too .直到在一次面试时被问到,稀里糊涂的回答了下.实在惭愧, 面试一定都是很注重 基础的,不管高级还是初级. 虽然基础好跟基础不好都可以写代码,网上那么 ...

  4. 使用Visual Studio Code开发Asp.Net Core WebApi学习笔记(三)-- Logger

    本篇是在上一篇的基础上添加日志功能,并记录NLog在Asp.Net Core里的使用方法. 第一部分:默认Logger支持 一.project.json添加日志包引用,并在cmd窗口使用 dotnet ...

  5. MySQL Disk--磁盘相关参数

    /sys/block/sda/queue/nr_requests 磁盘队列长度.默认只有 128 个队列,可以提高到 512 个.会更加占用内存,但能更加多的合并读写操作,速度变慢,但能读写更加多的量 ...

  6. vertx.io 与nodejs 一个简单的性能比较

    vertx.io 与node 都是可以进行js运行的一个引擎,但是vertx 支持的语言相对于node 多,可以查看官网.今天下网上查询相关的信息 时来了解到vertx.io 性能比node 好,于是 ...

  7. UltraEdit常用设置及快捷键

    = 关闭自动加载上次文件的方法,操作方法如下:首先,要打开UltraEdit,然后点击经[高级]-[配置],找到[文件处理]-[加载],把[重新载入先前在启动时打开的文件]勾去掉,并确定就可以了. 附 ...

  8. js模板引擎之juicer,特别好用

    中文文档地址 https://www.npmjs.com/package/juicer Juicer基础知识:语法2  http://blog.163.com/lvshutao@126/blog/st ...

  9. Spring 集成开发工具(STS)安装及配置

    安装 spring 集成开发工具,下载地址:https://spring.io/tools 下载后,解压,双击 STS ,运行. 如果提示: 去oracle的网站上下载了1.8版本的jdk,下载地址如 ...

  10. 轻松理解execl系列函数

    execl函数功能如下:启动一个可执行文件,并且对他进行传送参数.一些原型如下 #include <unistd.h> extern char **environ; int execl(c ...