在 MongoDb 中更新插入字典

2023-12-24

据我所知 mongodb 知道Dictionary作为一个对象,它不能进行任何与数组相关的操作。我更改了序列化并尝试了各种类型的字典序列化。但没有机会。
所以我将我的字段(字典)(全部)加载到内存中,更新它并将其设置回 mongodb。
有什么办法可以upsertmongodb 中的字典与 C# 驱动程序?


我的文档类型:

public class Site
    {
        public string Id { get; set; }
        //[BsonDictionaryOptions(DictionaryRepresentation.ArrayOfDocuments)]
        public Dictionary<string,string> Properties { get; set; }
    }

我的更新操作:

public ServiceResult UpdateProperties(string id, Dictionary<string,string> properties)
        {
            var baseList = Collection.Find(m => m.Id == id)
                .Project(s => s.Properties)
                .FirstOrDefault();

            if (baseList == null)
            {
                baseList = properties;
            }
            else
            {
                baseList.Upsert(properties); //update,insert dic by new one
            }

            var filter = Builders<Site>.Filter
                .Eq(m => m.Id, id);

            var update = Builders<Site>.Update
                .Set(m => m.Properties, baseList);

            try
            {
                Collection.UpdateOne(filter, update);

                return ServiceResult.Okay(Messages.ItemUpdated);

            }
            catch (Exception ex)
            {
                return ServiceResult.Exception(ex);
            }    
        }

我非常感谢您提供的任何帮助。


消歧义:

public static class DictionaryExtensions
    {
        public static void Upsert<TKey, TValue>(this Dictionary<TKey, TValue> source, 
                                          Dictionary<TKey, TValue> newOne)
        {
            foreach (var item in newOne)
            {
                source[item.Key] = item.Value;
            }
        }
    }

您可以浏览要更新/插入的所有属性,并对每个属性执行此操作:

UpdateDefinition<Site> upsert = null;
if (properties.Any())
{
    var firstprop = properties.First();
    upsert = Builders<Site>.Update.Set(nameof(Site.Properties) + "." + firstprop.Key, 
                               firstprop.Value);

    foreach (var updateVal in properties.Skip(1))
    {
        upsert = upsert.Set(nameof(Site.Properties) + "." + updateVal.Key, 
                                          updateVal.Value);
    }

    collection.UpdateOne(r => r.Id == "YourId", upsert, 
                                               new UpdateOptions { IsUpsert = true });
}

以前版本的答案,有多个更新:

foreach (var updateVal in properties)
{
    collection.UpdateOne(r => r.Id == "YourId", 
        Builders<Site>.Update.Set( nameof(Site.Properties)+ "." + updateVal.Key, 
                                   updateVal.Value), 
                                   new UpdateOptions { IsUpsert = true});
}

请注意,这只会添加新的键/值或更新现有的键/值,这不会删除任何内容。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 MongoDb 中更新插入字典 的相关文章

随机推荐

  • 对此 bash 脚本进行改进以模拟“tail --follow”

    我需要远程尾部日志文件 以便即使文件滚动 尾部也能继续工作 我尝试这样做 首先通过 ssh 直接使用 tail 命令 ssh root some remote host tail 1000f some directory applicati
  • 无法从 ngrx/store 取消订阅 ActionsSubject

    I use ngrx store实现从订阅商店获取日期的登录操作 登录组件是模态的 当我输入错误的密码时 我得到data type LOGIN FAILED 但是 当我关闭模式并重新打开它时 数据操作仍然是LOGIN FAILED代替INI
  • 为什么 Skaffold 在构建本地 docker 守护进程时要维护两个标签?

    询问于另一个问题 https stackoverflow com questions 65358738 is there any way to configure skaffold to build images on my local d
  • 文字控制模式的区别

    文字控制的直通模式和变换模式有什么区别 您也可以发布一个示例吗 有不同的文字模式Literal Mode 传递 控件的内容不被修改 Encode 控件的内容被转换为 HTML 编码的字符串 转换 不支持的标记语言元素将从控件的内容中删除 如
  • Wix Bootstrapper:Bootstrapper 事件序列

    我已经开始使用托管引导程序类和事件 简而言之 我添加了 Bootstrapper dll 它会给你命名空间 Microsoft Tools WindowsInstallerXml Bootstrapper 我能够从不同博客中提供的一些示例中
  • 如何禁用某些应用程序服务的动态 WebAPI

    我想关闭我的ABP项目中特定应用程序服务的自动WebAPI生成服务 RemoteService 属性可用于将类标记为远程服务或禁用本质上实现 IRemoteService 接口的特定类 RemoteService false public
  • 如何使用 FreeMarker 模板化嵌套 Pojo?

    我正在研究使用 FreeMarker 编写 EDI 文件 这些基本上是严格格式化 并经过验证 的电子发票 我决定从编写一个简单的示例开始 但一直坚持将其模板化为 嵌套 pojo 我的意思是一个 POJO 其中包含 POJO 其中这两个 PO
  • 是什么导致 Docker 映像中出现“无法找到数据收集器‘XPlat 代码覆盖率’”错误?

    我正在 DevOps Server 中设置一个构建 它只需运行 docker 构建 运行容器并从中收集测试结果 Dockerfile 使用 mcr microsoft com dotnet core sdk 2 2 映像作为其基础 在其上我
  • 通过 laravel 创建 stripe 计划

    我想从我的 stripe 应用程序创建一个计划 场景是用户被收取不同的价格作为定期付款 所以 这就是为什么我想为每个用户创建计划 我在用拉拉维尔 5并使用 laravel cashier 5 0 laravel cashier 只是没有内置
  • Eclipse Kepler JPA 错误

    我已经安装了 Eclipse Kepler 内部版本号 20130614 0229 当我尝试编译我的项目时 我遇到了大量与 JPA 相关的错误 我猜它们来自 Dali Java Persistence Tools 插件 我可以在插件列表中看
  • 实体框架 4 和同义词

    如果在数据库 A 中存在一个名为 MyTable 的表 该表实际上来自指向另一个数据库 B 的同义词 我可以在代表数据库 A 的实体框架模型中创建该表作为实体吗 因为它实际上驻留在在不同的数据库中 我很好奇 EF 4 的情况是否有所改善 h
  • 使用javascript查找字符串中最长的单词

    我试图找到字符串中最长的单词 但它不断返回第一个单词的长度 有任何想法吗 这是我的代码 function findLongestWord str var words str split var longest 0 for var i 0 i
  • 如何在 Angular 5 指令中使用 exportAs 来获取模板中的引用?

    我有以下指令 Directive selector changeColor exportAs changeColor export class ColorDirective constructor elem ElementRef rende
  • Android with Retrofit2 OkHttp3 - 多部分 POST 错误

    我在 Android 上使用 Retrofit2 和 OkHttp 进行 HTTP 请求 这里我正在做一个带有文档上传的 POST 请求 我遇到了以下错误 D OkHttp lt 500 Server Error http api driv
  • C# Regex.Match 大括号-仅内容? (不包括大括号)

    我一直无法找到答案 我可以使用Regex Matches方法只返回contents带有大括号的项目 如果我使用正则表达式 my MatchCollection值包括大括号 我想匹配 但只返回内容 这是我到目前为止所拥有的 Regex reg
  • 在Python中以单独显示所有边的方式绘制有向图

    我正在使用 Python 来模拟有向图上发生的过程 我想制作这个过程的动画 我遇到的问题是大多数 Python 图形可视化库将成对的有向边组合成单个边 例如 NetworkX http networkx lanl gov显示下图时仅绘制两条
  • 我怎样才能在 vs 2010 安装项目中为两个不同的发行版本拥有不同的属性等?

    我想要的是我的解决方案中只有一个安装项目 并且我希望能够在一台计算机上同时安装 release1 和 release2 版本 如版本 debug release1 release2 因此 release1 版本需要自己的程序文件夹 产品代码
  • 抓取重定向的页面

    我尝试抓取一个简单的页面 需要欢呼和请求 https www ishares com uk individual en products 251824 https www ishares com uk individual en produ
  • 当 spring.profiles.active 设置多个 Spring 环境配置文件时,优先顺序是什么

    我只是想知道是什么优先顺序是指定多个 Spring 活动配置文件时的顺序 说我想要default配置文件处于活动状态 但dev当有多个相同的元素 例如 bean 可供选择但具有不同的配置文件时 配置文件将覆盖它 比如说我有两个Propert
  • 在 MongoDb 中更新插入字典

    据我所知 mongodb 知道Dictionary作为一个对象 它不能进行任何与数组相关的操作 我更改了序列化并尝试了各种类型的字典序列化 但没有机会 所以我将我的字段 字典 全部 加载到内存中 更新它并将其设置回 mongodb 有什么办