MongoDB——更新操作(Update)c#实现
c#实现 Mongodb存储【文档局部更新】
如下:
递归更新字段 ,构建UpdateDefinition
- /// <summary>
- /// 构建更新操作定义
- /// </summary>
- /// <param name="bc">bsondocument文档</param>
- /// <returns></returns>
- private List<UpdateDefinition<BsonDocument>> BuildUpdateDefinition(BsonDocument bc, string parent )
- {
- var updates = new List<UpdateDefinition<BsonDocument>>();
- foreach (var element in bc.Elements)
- {
- var key = parent == null ? element.Name : $"{parent}.{element.Name}";
- var subUpdates = new List<UpdateDefinition<BsonDocument>>();
- //子元素是对象
- if (element.Value.IsBsonDocument)
- {
- updates.AddRange(BuildUpdateDefinition(element.Value.ToBsonDocument(), key));
- }
- //子元素是对象数组
- else if (element.Value.IsBsonArray)
- {
- var arrayDocs = element.Value.AsBsonArray;
- var i = 0;
- foreach (var doc in arrayDocs)
- {
- if (doc.IsBsonDocument)
- {
- updates.AddRange(BuildUpdateDefinition(doc.ToBsonDocument(), key + $".{i}"));
- }
- else
- {
- updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
- continue;
- }
- i++;
- }
- }
- //子元素是其他
- else
- {
- updates.Add(Builders<BsonDocument>.Update.Set(f => f[key], element.Value));
- }
- }
- return updates;
- }
注意其中key的构建,针对文档包含的子文档,需要对其key添加到根节点的路径。针对包含文档数组的,需要添加下标,指定到对应的标签进行数据的更新。
调用更新操作,更新多份文档操作如下:
- /// <summary>更新</summary>
- public async Task<IEnumerable<string>> UpdateAsync(MetadataCollection metadatas)
- {
- List<string> result = null;
- var kmds = metadatas.Select(e => e.As<Metadata>()).ToList();
- var docs = kmds.ConvertAll(DicConvertToBsonDoc);
- var updateOptions = new UpdateOptions { IsUpsert = true };
- try
- {
- foreach (var doc in docs)
- {
- var filter = Builders<BsonDocument>.Filter.Eq(f => f[iiid], doc[iiid]);
- var update = Builders<BsonDocument>.Update.Combine(BuildUpdateDefinition(doc,null));
- await _access.UpdateAsync(filter, update, updateOptions);
- }
- result = metadatas.Select(s => s.IIId).ToList();
- }
- catch (Exception ex)
- {
- IndexExceptionCodes.UpdatingIndexFailed.ThrowUserFriendly(ex.Message, "更新索引失败");
- }
- return result;
- }
其中,先将给定的模型列表转化为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#实现的更多相关文章
- MySQL 的更新操作update
1 更新操作(单表更新) 1)单表更新 update [low_priority] [ignore] table_reference set col_name1={expr1|default},col ...
- 事务处理操作(COMMIT,ROLLBACK)。复制表。更新操作UPDATE实际工作中一般都会有WHERE子句,否则更新全表会影响系统性能引发死机。
更新操作时两个会话(session)同时操作同一条记录时如果没有事务处理操作(COMMIT,ROLLBACK)则会导致死锁. 复制表:此方法Oracle特有
- Hive扩展功能(九)--Hive的行级更新操作(Update)
软件环境: linux系统: CentOS6.7 Hadoop版本: 2.6.5 zookeeper版本: 3.4.8 主机配置: 一共m1, m2, m3这三部机, 每部主机的用户名都为centos ...
- mongodb更新操作
除了查询条件,还可以使用修改器对文档进行更新. 1. $inc > db.tianyc03.find() { "_id" : ObjectId("50ea6b6f1 ...
- [转]MongoDB更新操作replaceOne()实例讲解
最近正在学习MongoDB,作为数据库的学习当然是要从CRUD开始学起了.这篇文章默认读者是知道如何安装MongoDB.如何运行MongoDB实例以及了解了MongoDB中的collection.do ...
- mongodb 更新操作
db.aaaa.update({},{$push:{money:{$each:[8,9,10],$slice:-4}}}) db.aaaa.update({},{$addToSet:{money:{$ ...
- MongoDB 文档的更新操作
在MongoDB中,更新单个doc的操作是原子性的.默认情况下,如果一个update操作更新多个doc,那么对每个doc的更新是原子性的,但是对整个update 操作而言,不是原子性的,可能存在前面的 ...
- java操作mongodb——更新数据
Java中可以通过updateOne,updateMany,replaceOne方法进行集合的文档更新.但是 _id 是不能更新的 updateOne只会更新一条数据,即使通过Filters.lt(& ...
- mongodb批量更新操作文档的数组键
persons文档的数据如下: > db.persons.find(){ "_id" : 2, "name" : 2 }{ "_id" ...
随机推荐
- 题目1003:A+B
题目1003:A+B 时间限制:1 秒内存限制:32 兆 题目描述: 给定两个整数A和B,其表示形式是:从个位开始,每三位数用逗号","隔开. 现在请计算A+B的结果,并以正常形式 ...
- Windows-CreateProcess-lpsiStartInfo-STARTUPINFO-dwFlags
dwFlags: 简单地告诉CreateProcess函数结构中哪些成员有效: STARTF_USESIZE:使用dwXSize和dwYSize STARTF_USESHOWWINDOWS: wSho ...
- EasyTouch中多种QuickGesture手势检测
EasyTouch中QuickGesture的用法 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 1 Qu ...
- WinFrom调试时,弹出你正在调试发布的版本
把下图这里改成DEBUG就好 还有项目属性里面也要改一下 问题解决!
- hdu1097
hdu1097 求a^b的末位数 打表O(1) import java.util.*; public class Main { static int [][]a = new int[15][15]; ...
- PHP 设计模式系列 —— 资源库模式(Repository)
1.模式定义 Repository 是一个独立的层,介于领域层与数据映射层(数据访问层)之间.它的存在让领域层感觉不到数据访问层的存在,它提供一个类似集合的接口提供给领域层进行领域对象的访问.Repo ...
- 手把手图文教你eclipse下如何配置tomcat
很多初学,尤其自学JavaWeb的朋友首次在eclipse下配置tomcat时,总会有种难下手的感觉,在此,笔者通过图文解说的方法,最直观的向大家演示一遍该配置过程,希望对大家有所帮助. 注:本文是建 ...
- hive 分区表
hive中创建分区表没有什么复杂的分区类型(范围分区.列表分区.hash分区.混合分区等).分区列也不是表中的一个实际的字段,而是一个或者多个伪列.意思是说在表的数据文件中实际上并不保存分区列的信息与 ...
- 使用just-api 进行接口测试
just-api 是基于配置的测试,同时支持基于jsonpath jsonschema 的数据校验, 对于数据的请求只集成hook,支持测试失败重试.测试报告.graphql api 测试.... 使 ...
- hybrid app、react-native 区别
hybrid app.react-native 区别: 项目 hybrid app react-native 组件 用HTML.CSS.JavaScript实现页面的制作,然后运行在Webview上( ...