尝试更新 MongoDb 数组元素时出错

2023-12-02

在我的 Azure CosmosDb MongoApi 中,我有带有嵌入文档数组的 JSON。

{
    "_id": ObjectId("5a95745df886842904b82f71"),
    "token": "value1",
    "channel": "value2",
    "urls":
    [
        {
            "url": "<url1>", 
            "interval": "<int>"
        },
        {
            "url": "<url2>"
            "interval": "<int>"
        }
    ]
}

我想更新特定数组元素中的“间隔”字段。问题是当我使用类似的解决方案时this or this,我最终得到一个例外:

MongoDB.Driver.MongoCommandException: Command findAndModify failed: Invalid BSON field name 'urls.$.interval'.

因此,我决定尝试在 Mongo Shell 中运行查询并得到相同的错误:

{
    "nMatched": 0,
    "nUpserted": 0,
    "nModified": 0,
    "writeError": 
    {
        "code": 2,
        "errmsg": "Invalid BSON field name 'urls.$.interval'"
    }
}

这是我的 C# 代码:

    var filterBuilder = Builders<User>.Filter;
    var filter = filterBuilder.Where(p => p.Token == model.Token && p.Channel == model.Channel && p.Urls.Any( u => u.Url == model.Url));
    var update = Builders<User>.Update.Set(p => p.Urls.ElementAt(-1).interval, 5);
    await _context.Users.FindOneAndUpdateAsync<User>(filter, update);

这是我的 MongoDb shell 请求:

db.Users.update( {"urls.interval": 60}, {$set: {"urls.$.interval": 30}} ); 

我的问题是导致此异常的原因是什么以及如何避免它?


Cosmos DB 目前不支持位置运算符。请使用以下解决方法:在客户端迭代文档和数组元素,更改所需元素并使用新数组对文档进行更新: 例如,假设您有以下元素的集合 users:

{ 
    "_id" : ObjectId("59d6b719708b990d6c9b3aca"), 
    "tags" : [
        {
            "id" : 1, 
            "value" : "11"
        }, 
        {
            "id" : 2, 
            "value" : "22"
        }, 
        {
            "id" : 3, 
            "value" : "32"
        }
    ]
}
 

...您可以发出以下命令来更新其中一个元素(在本例中 id=1):

db.users.find().forEach( 
        function(user) 
        { 
         user.tags.forEach( 
         function(tag) 
         {
               if (tag.id=="1")
               {
                       tag.value = "Updated!";                          
                       db.users.updateOne({_id : user._id}, {$set: {"tags": user.tags}});
               }
        }
        );
       }  
);

您可以调整 if() 中的条件,其粒度比位置运算符允许的更细。

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

尝试更新 MongoDb 数组元素时出错 的相关文章

  • C# 中一次性对象克隆会导致内存泄漏吗?

    检查这个代码 class someclass IDisposable private Bitmap imageObject public void ImageCrop int X int Y int W int H imageObject
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 防止控制台应用程序中的内存工作集最小化?

    我想防止控制台应用程序中的内存工作集最小化 在Windows应用程序中 我可以这样做覆盖 SC MINIMIZE 消息 http support microsoft com kb 293215 en us fr 1 但是 如何在控制台应用程
  • 混合模型优先和代码优先

    我们使用模型优先方法创建了一个 Web 应用程序 一名新开发人员进入该项目 并使用代码优先方法 使用数据库文件 创建了一个新的自定义模型 这 这是代码第一个数据库上下文 namespace WVITDB DAL public class D
  • 包恢复失败。回滚包更改 - Serilog.AspNetCore

    我有一个 asp net Core 项目 我正在尝试向其中添加一个记录器 我选择了我在其他项目中使用过的 SeriLog 但是当我尝试添加 Serilog AspNetCore 我得到的软件包版本 2 0 0 包恢复失败 回滚 后端 的包更
  • Guid.NewGuid().GetHashCode() 用于数据库

    这对于用作数据存储 SQL Server 的 ID 可靠吗 我会使用 guid 但我更喜欢数字值 A guid更有可能代表一个记录uniquely than a numeric value 随着 GUID 确保全球唯一性 GUID 可以跨数
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 来自嵌入图像的 BitmapSource

    我的目标是在 WPF 窗口上重写 OnRender 方法中绘制图像 someImage png 它是嵌入资源 protected override void OnRender System Windows Media DrawingCont
  • LinkLabel 无下划线 - Compact Framework

    我正在使用 Microsoft Compact Framework 开发 Windows CE 应用程序 我必须使用 LinkLabel 它必须是白色且没有下划线 因此 在设计器中 我将字体颜色修改为白色 并在字体对话框中取消选中 下划线
  • C# 获取数据表中所有重复行的计数

    我通过运行存储过程来填充数据集 并且从数据集中填充数据表 DataSet RawDataSet DataAccessHelper RunProcedure storedprocedureName this will just return
  • 我们可以通过指针来改变const定义的对象的值吗?

    include
  • 读取依赖步行者输出

    I am having some problems using one of the Dlls in my application and I ran dependency walker on it i am not sure how to
  • C:设置变量范围内所有位的最有效方法

    让我们来int举个例子 int SetBitWithinRange const unsigned from const unsigned to To be implemented SetBitWithinRange应该返回一个int其中所有
  • 如何编写一个接受 int 或 float 的 C 函数?

    我想用 C 语言创建一个扩展 Python 的函数 该函数可以接受 float 或 int 类型的输入 所以基本上 我想要f 5 and f 5 5 成为可接受的输入 我认为我不能使用if PyArg ParseTuple args i v
  • 如何高效计算连续数的数字积?

    我正在尝试计算数字序列中每个数字的数字乘积 例如 21 22 23 98 99 将会 2 4 6 72 81 为了降低复杂性 我只会考虑 连续的数字 http simple wikipedia org wiki Consecutive in
  • Streamwriter 覆盖 txt 文件中的文本

    有没有什么方法可以重新打开流写入器而不创建新的写入对象 因为此时 当调用 WriteOdd 时 streamwriter 正在覆盖在它之前调用的 WriteEven public void WriteEven StreamWriter wr
  • winform c# 中的弹出窗口

    我正在开发一个需要弹出窗口的项目 但问题是我还希望能够通过表单设计器在此弹出窗口中添加文本框等 所以基本上我有一个按钮 当您单击它时 它将打开我在表单设计器中设计的另一个窗口 我一直在谷歌搜索 但还没有找到我需要的东西 所以我希望你们能帮助
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何在 C# 中获取 CMD/控制台编码

    我需要指定正确的代码页来使用 zip 库打包文件 正如我所见 我需要指定控制台编码 在我的例子中为 866 C Users User gt mode Status for device CON Lines 300 Columns 130 K
  • 嵌入式linux编写AT命令

    我在向 GSM 模块写入 AT 命令时遇到问题 当我使用 minicom b 115200 D dev ttySP0 term vt100 时它工作完美 但我不知道如何在 C 代码中做同样的事情 我没有收到任何错误 但模块对命令没有反应 有

随机推荐

  • 更新 chromium 版本后量角器问题

    我刚刚更新了我的 chromium 版本 getAttribute 总是返回 null 有人知道为什么吗 在此更新之前工作正常 CHROMIUM REVISION 884014 element by id elementId getAttr
  • OpenGL ES 2.x:有什么方法可以重用深度缓冲区进行离屏和屏上渲染?

    我正在进行双通道渲染 第一通道我渲染到纹理 第二通道我渲染到屏幕 我在两次渲染过程中渲染相同的多边形 但使用不同的着色器 特别是 第二遍使用着色器 该着色器将第一遍生成的纹理作为参数 目前 我的第一遍有一个帧缓冲区 其中包含用于颜色附件的纹
  • 在Python中将字符串转换为变量名[重复]

    这个问题在这里已经有答案了 我有任何字符串 比如 水牛 x buffalo 我想将此字符串转换为某个变量名称 例如 buffalo 4 不仅是这个例子 我想将任何输入字符串转换为某个变量名称 我应该怎么做 在Python中 x buffal
  • 如何在 Eclipse 中从验证中排除特定文件夹或文件?

    我们在单元测试中使用了一堆格式错误的 XML 文件来检查我们的应用程序是否可以处理它们 Eclipse 将此 XML 文件标记为错误 从而污染 问题视图 有没有办法从 Eclipse 验证器中排除特定文件夹 在窗口 gt 首选项的验证部分中
  • NSDateFormatter 返回 nil

    我正在尝试解析以以下格式传递的日期 2014 03 26T05 07 42 14286Z My NSDateFormatter代码看起来像这样 NSDateFormatter dateFormatter NSDateFormatter al
  • 如何在 Bash 中测试变量是否为数字?

    我只是不知道如何确保传递给我的脚本的参数是数字还是不是数字 我想做的就是这样 test isnumber 1 VAR 1 echo need a number 有什么帮助吗 一种方法是使用正则表达式 如下所示 re 0 9 if yourn
  • C#/WPF 应用程序实现应用 CLI 的简单 IPC 机制

    所以我在 Net 上阅读了大量有关进程间通信的内容 命名管道 远程处理 这一切看起来都很棒 但对于我需要做的事情来说可能有点过分了 我想向我的 WPF 应用程序添加一个命令行界面 因此我需要一种简单的 IPC 机制来将字符串从一个进程发送到
  • DosBox 中的向量头文件

    我正在使用 DosBox 0 74 我想使用向量函数 但我找不到它的头文件 它不是
  • 如何在 Android 上使用 VPN API? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我正在探索 Android 中的 VPN 连接 我想知道如何使用应用程序在 Android 中设置 VPN 连接 我遇到了一些名为的示例代码ToyVpn 我运行了该应用程序 但我不知
  • testcafe 中其他几名跑步者的跑步大师?

    我有几个跑步者正在使用 Promise race 在特定时间完成测试用例 假设我有 runner1 js runner2 js runner3 js 如何创建主运行程序以便可以一起运行所有这些运行程序 const createTestCaf
  • 带有单引号和双引号的 bash 别名命令

    我有以下命令 svn status awk 1 M print 2 我如何用它来创建别名 我努力了 alias xx svn status awk 1 M print 2 你只需要正确地转义它 alias xxx svn status aw
  • 用户友好的错误页面在生产环境中不显示

    最近 我的生产环境中停止显示用户友好的错误页面 我正在使用 Rails 3 0 3 我的中有以下内容config environments production rb config action controller consider al
  • 调试在 dllhost.exe 中运行的 inproc com 服务器

    我正在编写一个在 dllhost exe 代理中运行的 inproc com dll 但在调试它时遇到了问题 如果同时运行多个 dllhost exe 找到正确的一个来附加调试器将会很烦人 如果有很多正在运行 有没有一种简单的方法可以识别您
  • 初学者从结构数组中删除第一个元素 (C)

    我有一个结构数组 实际上它是一个按优先级排序的堆数组 typedef struct char name MAX CHARACTERS 1 int priority person person p MAX HEAPSIZE 1 并想要删除数组
  • 使用 python 更快地搜索 Azure blob 名称?

    我有一个需要在 Azure 上搜索的文件名列表 现在 作为一个菜鸟 我正在循环每个 blob 名称并比较字符串 但我认为必须有最简单 快速的方法来完成此任务 当前的解决方案使我的 HTTP 响应非常慢 def ifblob exists s
  • 为什么 var_dump 可以确定私有变量的值,但在尝试访问单个属性时却不能

    我有一个对象被扔到会话数组中 我想运行 foreach 在 items 属性上 我似乎无法访问它 我看到它是私有的 但我忍不住想知道为什么 var dump 可以向我显示该属性包含的内容 但我无法读取数据 因为它会引发致命错误 我想如果我真
  • ruby on Rails 中的 Bootstrap 模式不起作用

    我正在尝试实现一个模式来为我的应用程序创建新用户 由于某种原因无法使其工作 这段代码只是淡入淡出 并且没有显示任何模式 我不明白为什么 事实上 我正在使用与此答案完全相同的代码如何使用 link to 添加引导模式 以便链接内容在模式中打开
  • 在 iOS 中将 PDF 文本写入 PDFContext

    通过以下方式绘制到 pdf 上下文非常简单 UIGraphicsBeginPDFContextToFile pdfFile CGRectZero nil UIGraphicsBeginPDFPageWithInfo sheet frame
  • UITableViewCell 内 UITableView 的动态行高度

    我有一个 主 UITableView 其中我使用从 xib 加载的不同单元格 其中一些单元格本身也有一个 UITableView 现在我已将每个单元格的行高设置为原始 xib 大小 但是 我希望高度动态并与 子 UITableView 中的
  • 尝试更新 MongoDb 数组元素时出错

    在我的 Azure CosmosDb MongoApi 中 我有带有嵌入文档数组的 JSON id ObjectId 5a95745df886842904b82f71 token value1 channel value2 urls url