如何在 mongodb 中更新多个数组元素

2024-01-27

我有一个 Mongo 文档,其中包含一个元素数组。

我想重置.handled数组中所有对象的属性,其中.profile = XX.

该文件的形式如下:

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "user_id": "714638ba-2e08-2168-2b99-00002f3d43c0",
    "events": [{
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 20,
            "data": "....."
        }
        ...
    ]
}

所以,我尝试了以下方法:

.update({"events.profile":10},{$set:{"events.$.handled":0}},false,true)

然而它只更新first每个文档中匹配的数组元素。 (这是定义的行为$ - 位置运算符 http://www.mongodb.org/display/DOCS/Updating#Updating-The%24positionaloperator.)

我怎样才能更新all匹配的数组元素?


随着MongoDB 3.6 发布 https://docs.mongodb.com/master/release-notes/3.6/#arrayfilters(并且在 MongoDB 3.5.12 的开发分支中可用)您现在可以在单个请求中更新多个数组元素。

这使用了过滤位置$[<identifier>] https://docs.mongodb.com/master/reference/operator/update/positional-filtered/此版本中引入的更新运算符语法:

db.collection.update(
  { "events.profile":10 },
  { "$set": { "events.$[elem].handled": 0 } },
  { "arrayFilters": [{ "elem.profile": 10 }], "multi": true }
)

The "arrayFilters"传递给选项.update() https://docs.mongodb.com/master/reference/method/db.collection.update/甚至.updateOne() https://docs.mongodb.com/master/reference/method/db.collection.updateOne/, .updateMany() https://docs.mongodb.com/master/reference/method/db.collection.updateMany/, .findOneAndUpdate() https://docs.mongodb.com/master/reference/method/db.collection.findOneAndUpdate/ or .bulkWrite() https://docs.mongodb.com/master/reference/method/db.collection.bulkWrite/方法指定与更新语句中给出的标识符匹配的条件。任何符合给定条件的元素都将被更新。

注意到"multi"正如问题上下文中给出的那样,预期这将“更新多个元素”,但事实并非如此,而且仍然不是这种情况。这里的用法适用于“多个文件”一如既往的情况或现在以其他方式指定为强制设置.updateMany() https://docs.mongodb.com/master/reference/method/db.collection.updateMany/在现代 API 版本中。

NOTE有点讽刺的是,因为这是在“选项”参数中指定的.update()与方法一样,语法通常与所有最新发布的驱动程序版本兼容。

然而,事实并非如此mongoshell,因为该方法在那里实现的方式(“讽刺的是为了向后兼容”)arrayFilters解析选项的内部方法无法识别和删除参数,以便提供与先前 MongoDB 服务器版本和“遗留”的“向后兼容性”.update()API 调用语法。

所以如果你想在mongoshell 或其他“基于 shell”的产品(特别是 Robo 3T),您需要来自开发分支或生产版本的最新版本(3.6 或更高版本)。

也可以看看positional all $[] https://docs.mongodb.com/master/reference/operator/update/positional-all/它还更新“多个数组元素”,但不适用于指定条件并适用于all数组中的元素,其中这是所需的操作。

另请参阅使用 MongoDB 更新嵌套数组 https://stackoverflow.com/a/23577266/2313887了解这些新的位置运算符如何应用于“嵌套”数组结构,其中“数组位于其他数组内”。

重要的- 从以前版本升级的安装“可能”没有启用 MongoDB 功能,这也可能导致语句失败。您应该确保升级过程完整,包含索引升级等详细信息,然后运行

   db.adminCommand( { setFeatureCompatibilityVersion: "3.6" } )

或适用于您安装的版本的更高版本。 IE"4.0"目前适用于版本 4 及更高版本。这启用了新的位置更新运算符等功能。您还可以检查:

   db.adminCommand( { getParameter: 1, featureCompatibilityVersion: 1 } )

返回当前设置

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

如何在 mongodb 中更新多个数组元素 的相关文章

  • 将 numpy 代码点数组与字符串相互转换

    我有一个很长的 unicode 字符串 alphabet range 0x0FFF mystr join chr random choice alphabet for in range 100 mystr re sub W mystr 我想
  • MongoDB中如何通过引用字段进行查询?

    我有两个 Mongo 模式 User id ObjectId name String country ObjectId Reference to schema Country Country id ObjectId name String
  • Mongodb:语法错误:意外的标识符

    我是 mongodb 的新手 我正在使用 mongolab 创建免费数据库 我的数据库名称是 enron 使用在线 mongoshell 连接到 mongo 数据库然后发生错误 mongo ds033499 mongolab com 334
  • JSON-LD 构建单个对象数组

    有没有办法将单个对象强制放入数组 每次都测试对象类型真的很烦人 我尝试了这个上下文 但它不起作用 还有JSON LD Playground 中的示例 http tinyurl com ph7p35v 通过此上下文 资源将转换为单个对象 而不
  • MongoTemplate upsert - 从 pojo 进行更新的简单方法(哪个用户已编辑)?

    这是一个简单的 pojo public class Description private String code private String name private String norwegian private String en
  • VBA中的字符串是可以迭代的数组吗?

    VBA中字符串是数组吗 例如 我可以像在 C C 中那样迭代它吗 做这样的事情 char myArray 10 for int i 0 i lt length i cout lt lt myArray i VBA 中的等价物是什么 它的行为
  • Minizinc:生成有效的转变

    希望有人能帮助我解决这个问题 最初的问题是生成有效的班次 如下所述 我有这样的数组 m m m o o l l m m m l m m m 具有固定长度 S 其中 m 是工作 o 是办公室 我自由了 我需要确保至少每 6m 就有两个 l 在
  • 更改API数据输出的布局

    我是 API 集成和 PHP 的新手 我最近将 VIN 解码器集成到我的应用程序中 在输入框中输入车辆的 VIN 选择提交 然后就会显示 API 数据库中有关该车辆的所有信息 数据存储为关联数组 其中包含类别及其相应元素 例如 对于 VIN
  • 将多维数组转换为单数组(Javascript)

    我有一个对象数组 来自 XLSX js 解析器 因此其长度和内容各不相同 表示已给予项目的资助 简化后 它看起来像这样 var grants id p 1 location loc 1 type A funds 5000 id p 2 lo
  • 护照本地猫鼬帐户注册的附加字段?

    我将 Passport local mongoose 与 Node js Express js MongoDB 一起用于 Web 应用程序 我想使用用户名字段 密码字段 公司名称字段和电话号码字段 所有字段 来注册用户作为字符串 但是 我只
  • 需要解释搜索最小大和的算法

    我正在解决 Codility 问题作为练习 但无法回答其中一个问题 我在互联网上找到了答案 但我不明白这个算法是如何工作的 有人可以引导我逐步完成它吗 这是问题 You are given integers K M and a non em
  • 读取文本文件并将列存储在数组中

    我的文件看起来像这样 01 01 5 00 1 50 7 50 02 01 4 00 3 00 12 00 02 02 3 00 4 00 12 00 03 01 4 50 3 00 13 50 03 01 7 50 2 50 18 75
  • 如何释放字符指针数组?

    我使用此方法将列表中的值转换为数组 以便在 execvp 系统调用中使用 char list2argarray struct shellvalue values int count char array char malloc count
  • Pygame - 使用 SurfArray 将某种颜色的像素重新着色为另一种颜色(数组切片问题)

    我正在尝试为游戏制作调色板交换功能 并且正在尝试找到一种将某种颜色的像素颜色更改为另一种颜色的方法 我已经能够使用我在教程中找到的这个函数使所有像素具有相同的颜色 def color surface self surface red gre
  • Redim Preserve 给出“下标超出范围”

    我想要Redim Preserve一个数组我不断收到错误 下标超出范围 我知道只有最后一个维度的大小可以更改 这正是我正在做的事情 这里出了什么问题 数组的类型是Variant BmMatrix Sheets BENCH Range a60
  • MongoDB:在具有未知键的对象中查找给定字段值的文档

    我正在建立一个关于论文 论点的数据库 它们与其他参数相关 我将这些参数放置在带有动态键 https stackoverflow com questions 12393351 using a variable in mongodb updat
  • 为什么这个二维指针表示法有效,而另一个则无效[重复]

    这个问题在这里已经有答案了 这里我编写了一段代码来打印 3x3 矩阵的对角线值之和 这里我必须将矩阵传递给函数 矩阵被传递给指针数组 代码可以工作 但问题是我必须编写参数的方式如下 int mat 3 以下导致程序崩溃 int mat 3
  • Node.js 和 Passport 对象没有 validPassword 方法

    我正在使用 Node js Express Passport 创建一个简单的身份验证 本地 到目前为止我所达到的效果是 当输入错误的用户名或密码时 用户将被重定向到错误页面 但是当用户输入正确的用户名和密码时 我收到此错误 node mod
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • 我可以将 MongoDB 与实体框架一起使用吗?

    实体框架有可能支持MongoDB数据库吗 有人写过实体框架MongoDB Provider吗 简短的回答 不 这肯定是可能的 但不合理 MongoDB 是文档数据库 不支持集合之间的任何物理关系 EF 非常适合 SQL MySQL 等关系数

随机推荐

  • 如何用 Python 创建一个能记住客户端的简单多线程套接字服务器

    如何制作一个简单的 Python 回显服务器来记住客户端并且不会为每个请求创建新的套接字 必须能够支持并发访问 我希望能够连接一次并使用此客户端或类似客户端不断发送和接收数据 import socket sock socket socket
  • 如何在 C# 中构建 XML?

    如何在 C 中生成有效的 XML 这取决于场景 XmlSerializer当然是一种方法 并且具有直接映射到对象模型的优点 在 NET 3 5中 XDocument等等也都非常友好 如果尺寸很大 那么XmlWriter是你的朋友 For a
  • 无法将参数值从字符串转换为小数(当字段为空时)

    我遇到了一个已经完成了一半的问题 现在的问题是我写的 使用vb net和mssql 2014 ent作为后端 这是我写的查询 cmd New SqlCommand insert into FAMPAR Open Bal Curr Bal D
  • HTML XPath:提取文本时有选择地避免标签

    后续行动 HTML XPath 提取与多个标签混合的文本 https stackoverflow com questions 10618016 html xpath extracting text mixed in with multipl
  • 从具有自定义集合属性的 UserControl 的项目进行绑定

    这个问题是 续集 这个问题 https stackoverflow com questions 5144009 custom controls content cant bind to parent of the control 我已经应用
  • 指南针 SCSS 颜色代码小写

    在我的团队中 我们有相同版本的 Compass Compass 0 12 2 Alnilam 当 Compass 编译我的 SCSS 时 SCSS 中的颜色代码从大写 A0CAE3 更改为小写 a0cae3 只有我有这个问题 其他开发人员都
  • 为什么 Rust 编译器要求我限制泛型类型参数的生命周期(错误 E0309)?

    为什么 Rust 编译器会发出错误 要求我限制以下结构中泛型参数的生命周期 pub struct NewType lt a T gt x a T error E0309 the parameter type T may not live l
  • Android 推送通知的自定义声音不起作用 (FCM)

    我有使用云功能中的 FCM 工作的推送通知 这适用于 iOS 和 Android 并在 iOS 上显示相应的图标并播放自定义声音 除了 Android 的自定义声音外 一切正常 它只是播放默认声音 我创建了一个文件夹并将声音文件添加到其中
  • Marionette 布局和区域有什么区别?

    Marionette 提供了两个名为Regions http derickbailey github com backbone marionette marionette region and Layouts http derickbail
  • 如何解析以字符串形式给出的数学表达式并返回一个数字? [复制]

    这个问题在这里已经有答案了 Java 有没有办法从这个数学表达式中得到结果 String code 5 4 7 15 另一方面 解析算术表达式的最佳方法是什么 您可以将其传递给豆壳 http www beanshell org bsh In
  • 如何以本地用户身份(无管理员权限)在 Windows 上安装 NodeJS LTS

    我以简单用户身份使用 Windows 我没有任何管理员权限 并且想要安装 NodeJS LTS On the 下载站点 https nodejs org en download 我可以选择仅下载二进制文件node exe 其中不包括npm
  • 打开文件的命令按钮 - 位于同一单元格按钮中的文件路径对齐到

    我正在尝试获取一个可以分配给命令按钮的宏 我有多个按钮可以打开不同的文件 因此在每个单元格中我都包含不同的文件路径 目前 我的命令按钮正在寻找特定的单元格引用并打开该值 有什么方法可以让宏在与其对齐的单元格中查找值 我目前正在使用两个宏 一
  • 没有这样的目的地

    我在我的网站中使用 Stripe 方法 用户从我的网站购买产品并通过 stripe 完成付款 我想收取佣金并将剩余的钱发送给服务提供商 当我尝试在条纹中使用传输方法时 它会显示错误消息 message No such destination
  • 如何使用 jq 获取两个 JSON 数组的交集

    给定数组 X 和 Y 最好都作为输入 但否则 一个作为输入 另一个硬编码 如何使用 jq 输出包含两者共有的所有元素的数组 例如f 的值是多少 使得 echo 1 2 3 4 jq f 2 4 6 8 10 会输出 2 4 我尝试过以下方法
  • 你能在 jQuery 中扩展 val() 函数吗?

    有没有办法扩展 jQuery 中的 val 函数 基本上 我想要做的是如果有内容被动态输入到输入中 则设置一个类变量 通常会是这样的 var thisVal Hello World myInput val thisVal addClass
  • Javascript parseFloat 和 null

    我对 javascript 非常陌生 因为我目前正在 jQuery Mobile 中制作跨平台 Web 应用程序 我已经使用了 XML 解析到 HighCharts 图表的示例 但是当我在系列数据中遇到 null 时 它无法绘制任何线条并使
  • 颜色逐渐变化

    屏幕左上角的标志如何随着鼠标滑过而逐渐改变颜色 我认为它是用 jquery 完成的 如果您不知道代码 您能给我指点可以的教程吗 谢谢 http www shopdev co uk blog http www shopdev co uk bl
  • 即使进行所有优化,Android 模拟器也会出现延迟

    HAXM 启用版本 7 1 0 我验证了它在模拟器运行时正常工作 模拟器使用 Nvidia GPU 但在任何给定时间它仅使用最多 7 的 GPU 我有 27 3 1 的模拟器版本 最新 尝试过 x86 图像和 x86 x64 图像 我尝试过
  • 多个按钮上的 javascript 函数

    我有三个按钮 我希望它们在按下时改变颜色 并在再次按下时恢复为无颜色 我在 stackoverflow 上找到了这段代码 它几乎可以让我做到这一点 但是它只适用于一个按钮 其他两个不受影响 另外 当我按下另外两个按钮中的一个时 第一个按钮会
  • 如何在 mongodb 中更新多个数组元素

    我有一个 Mongo 文档 其中包含一个元素数组 我想重置 handled数组中所有对象的属性 其中 profile XX 该文件的形式如下 id ObjectId 4d2d8deff4e6c1d71fc29a07 user id 7146