如何使用 C# MongoDB.Driver 更新深度嵌套数组?

2024-03-21

我有这样的模型:

{  
   "_id":"5b90eea8c02e062be2888446",
   "storeGuid":"e97d4730-9b8a-49ed-be87-caf4054439aa",
   "storeId":"0",
   "storeDbName":"0",
   "tenant":"dev",
   "configGroup":[  
      {  
         "groupName":"peopleCounter",
         "config":[  
            {  
               "key":"averageWaitPeriodTime",
               "value":"60",
            }
         ]
      },
      {  
         "groupName":"sessionMonitor",
         "config":[  
            {  
               "key":"testKey1",
               "value":"987",
            },
            {  
               "key":"testKey2",
               "value":"123",
            }
         ]
      }
   ]
}

我正在尝试更新value for "key":"testKey2"

我有这样的更新声明:

await coll.UpdateOneAsync(
    x => x.StoreGuid == storeGuid
         && x.ConfigGroup.Any(y => y.GroupName == groupName
                                   && y.Config.Any(z => z.Key == model.Key)),
    Builders<StoreModel>.Update.Set(x => x.ConfigGroup[-1].Config[-1].Value, model.Value));

例如,当我尝试更新时groupName使用这样的过滤器ConfigGroup[-1]有用。

但在这种情况下,当我们有ConfigGroup[-1].Config[-1]这是行不通的。

我知道如何更新值的两个选项:

  • 只需使用更新整个列表ConfigGroup[-1].Config
  • 或者为过滤器指定具体索引,例如ConfigGroup[configGroupIndex].Config[configKeyIndex].Value

但我想知道为什么它不起作用-1指数。 以及如何正确地做到这一点。

请使用以下方式回答时间:2019-03-17 标签:c#MongoDB.Driver.

提前致谢。


它不适用于乘法的原因'-1'因为它与位置运算符 https://docs.mongodb.com/manual/reference/operator/update/positional/ $。 在“嵌套数组”主题下的官方文档中,我们可以看到以下内容:

位置 $ 运算符不能用于遍历的查询 多个数组,例如遍历嵌套数组的查询 在其他数组中,因为 $ 占位符的替换是 单一值

From 蒙古数据库 3.6有一些新功能允许使用嵌套数组。

全位置运算符 https://docs.mongodb.com/manual/reference/operator/update/positional-all/

过滤后的位置运算符 https://docs.mongodb.com/manual/reference/operator/update/positional-filtered/:

过滤后的位置运算符$[<identifier>]识别数组 与更新的 arrayFilters 条件匹配的元素 手术

因此,使用过滤后的位置运算符,我的代码现在如下所示:

await coll.UpdateOneAsync(x => x.StoreGuid == storeGuid,
    Builders<StoreModel>.Update.Set("configGroup.$[g].config.$[c].value", model.Value),
    new UpdateOptions
    {
        ArrayFilters = new List<ArrayFilterDefinition>
        {
            new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("g.groupName", groupName)),
            new BsonDocumentArrayFilterDefinition<BsonDocument>(new BsonDocument("c.key", model.Key))
        }
    });
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 C# MongoDB.Driver 更新深度嵌套数组? 的相关文章

随机推荐

  • 来自 Bitbucket 的“Go Get”私人仓库

    所以基本上 我有一个 Openshift 项目 在 Git 推送上 使用 Go get 下载所有库并即时构建项目 因此 我有一些代码不希望人们从我自己的库中看到 为了正确编译 代码需要从 github com 或另一个存储库获取 所以我创建
  • Ant 不可变属性到可变属性

    我有个问题 我正在使用 maven 的 antrun 插件 然后执行下一步 我有文件夹和子文件夹 我不知道什么叫子文件夹及其编号 我用它们的名称对此子文件夹进行存档 子文件夹名称 1 存档名称 1 acp
  • 我应该声明并检查 PHP 中是否存在变量吗?

    我注意到 XAMPP 上启用了严格的错误报告 并且现在出现未定义的索引错误 我只有两个小问题 我还在学习 我知道你不知道have在 PHP 中声明变量 但是声明它们有什么好处吗 如果不是 为什么在我未定义错误的情况下启用严格错误报告时会出现
  • 从字符串生成正则表达式

    我希望从包含数字的字符串生成正则表达式 然后使用它作为模式来搜索相似的字符串 例子 String s Page 3 of 23 如果我将所有数字替换为 d StringBuilder sb new StringBuilder for int
  • 在 JavaScript 中移动鼠标指针

    是否可以使用 JavaScript 移动鼠标 使其位于文本输入内 我不知道如何移动实际渲染的鼠标指针 但是您可以将焦点设置在元素上吗 document getElementById the text input id focus
  • ColdFusion 站点应使用哪种计算机辅助翻译格式?

    我正在创建一个多语言网站 需要支持至少五种不同的语言 包括韩语和中文 站点语言是 ColdFusion 因此 Java 是本地语言 我想让网站尽可能容易地供下一个程序员更新 并让第三方翻译人员使用比挖掘 SQL 数据库更容易的工具 到目前为
  • Node.js 找不到模块 - 干扰 Windows 上的 cygwin

    我正在测试 Bootstrap 框架 来自 Twitter 并尝试在安装 Node js 后在本地构建它 它失败了 因为它找不到 less 模块 我也使用 npm install g less 安装了该模块 C Users geir cod
  • makefile 并行运行目标

    我有以下 makefile 有两条规则 有没有办法并行运行这两个规则 我的意思是最大化 核心能力 我看到这个section https www gnu org software make manual make html Parallel但
  • sql server UTF8问题

    我有一些 utf8 数据 我想批量插入 sql server 2005 我使用的是 CODEPAGE 65001 BULK INSERT bla FROM D bla txt WITH CODEPAGE 65001 FIELDTERMINA
  • ASIHTTPRequest UIWebView加载文档

    使用 AsiHttpRequest 和 UIWebView 查看文档 pdf doc xls 的最佳方式是什么 我尝试了以下操作 但 UIWebView 正在显示 html NSString baseURL http xxxxxx open
  • Unity - GetComponentsInChildren() 返回顺序

    我知道它返回在父级层次结构中找到的给定组件 但是按什么顺序 我需要知道 因为我想用它来初始化我的脚本 并且我必须首先初始化父级 然后再初始化子级 因为较低层次结构的组件使用其直接父级的计算值 GetComponentsInChildren
  • 如何以编程方式从菜单中删除菜单项?

    我正在开发一些 Android 应用程序 并且我有一些菜单代码 menu menu
  • 使用powershell从txt文件中提取带有两个分隔符的列

    我有一个sample txt 文件 Processing Cl Cog u l Cg txt V DM Nv AL Ft He Se Fe Bt L Ey 0 Ct Cu3 我需要将此文件分成 4 个不同的列 并在之前添加新列 输出 csv
  • SignalR:使用 GlobalHost.ConnectionManager 发送数据不起作用

    我有一个这样的中心 public class MessageHubBub Hub public void ServerMethod Clients All sayHi hello GlobalHost ConnectionManager G
  • 无法在React应用程序中导入web3库

    node modules cipher base index js 中的错误 3 16 43 找不到模块 错误 无法解析 C Users Sumana Desktop Web3 web3app node modules cipher bas
  • 基于计数器递增 Python 字典值

    我有一本包含重复值的字典 Deca dict 1 2 506 2 2 506 3 2 506 4 2 600 5 2 600 6 1 650 我使用了 collections Counter 来计算每个集合的数量 decaAdd occur
  • didSelectViewController 方法没有被调用(带有故事板)

    我有 2 个版本的选项卡式 ios5 应用程序 一个使用情节提要创建 一个使用 xib 文件创建 故事板版本不调用UITabBarControllerDelegate method didSelectViewController xib 版
  • toml 中的 mypy 覆盖被忽略?

    以下是 mypy 文档中 toml 文件示例的简化版本 tool mypy python version 3 7 warn return any true warn unused configs true tool mypy overrid
  • 为什么 cabal sandbox init 不像 virtualenv 那样改变 PATH?

    这里是 Haskell 新手和 Python 爱好者 我想我可能在这里遗漏了一些东西 但是如果你看看Yesod 的快速入门 http www yesodweb com page quickstart 作者安装一些软件包before caba
  • 如何使用 C# MongoDB.Driver 更新深度嵌套数组?

    我有这样的模型 id 5b90eea8c02e062be2888446 storeGuid e97d4730 9b8a 49ed be87 caf4054439aa storeId 0 storeDbName 0 tenant dev co