如果条目不包含两个匹配的字段,则 mongo 添加到嵌套数组

2023-11-29

我有一个 mongo 文档,其中包含一个名为 History 的数组:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "email@address",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another": 3
        }
    ]
}

我想向每个历史对象添加字段或更新字段IF名称和组织匹配,但是如果不匹配,我想使用查询的名称和组织向数组添加一个新对象,并在必要时向该对象添加/更新其他字段。

So:

此查询找到匹配的一个:

db.users.find({ 
    email:"email@address",
    $and: [
        { "history.name": "Test123", "history.organisation": "Rat"}
    ]
})

但是,如果数组中不存在history.name 和history.organization 的组合,我很难让更新/更新插入工作。

我认为我需要做的是:

“如果此历史名称不等于“Test123”并且历史组织不等于“Rat”,则使用这些字段以及更新查询中提供的任何其他字段将对象添加到数组中。”

我试过这个:

db.users.update({ 
    email:"email@address",
    $and: [
        { "history.name": "Test123", "history.organisation": "Rat"}
    ]
}, {
    history: { name: "Test123"},
    history: { organisation: "Rat"}
}, {upsert:true})

但这给了我E11000 duplicate key error index: db.users.$email_1 dup key: { : null }

非常感谢任何帮助。

感谢社区!


恐怕单个原子更新是不可能的,您必须执行几次满足这两个条件的更新操作。

将更新逻辑分解为两个不同的更新操作,第一个需要使用位置性的$操作员来识别其中的元素history你想要的数组和$set更新现有字段。这个操作遵循以下逻辑如果名称和组织匹配,则更新字段

现在,您想要使用findAndModify()方法,因为它可以返回更新的文档。默认情况下,返回的文档不包含更新时所做的修改。

因此,有了这个武器库,您就可以在下一个操作中探测您的第二个逻辑,即如果数组中不存在“history.name”和“history.organization”的组合,则更新。有了这第二 更新操作,您需要使用$push运算符来添加元素。

以下示例演示了上述概念。它最初假设您将查询部分和文档作为单独的对象进行更新。

举个例子,当我们有与现有历史数组匹配的文档时,它只会执行一次更新操作,但如果文档不匹配,那么findAndModify()方法将返回 null,在第二个更新操作中使用此逻辑将文档推送到数组:

var doc = {
        "name": "Test123",
        "organisation": "Rat"
    }, // document to update. Note: the doc here matches the existing array
    query = { "email": "email@address" }; // query document

query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
    "query": query,
    "update": { 
        "$set": { 
            "history.$.name": doc.name,
            "history.$.organisation": doc.organisation
        }
    }
}); // return the document modified, if there's no matched document update = null

if (!update) {
    db.users.update(
        { "email": query.email },
        { "$push": { "history": doc } }
    );
}

对匹配的文档执行此操作后,查询集合将产生相同的结果

db.users.find({ "email": "email@address" });

Output:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "email@address",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another" : 3
        }
    ]
}

现在考虑不匹配的文档:

var doc = {
        "name": "foo",
        "organisation": "bar"
    }, // document to update. Note: the doc here does not matches the current array
    query = { "email": "email@address" }; // query document

query["history.name"] = doc.name; // create the update query
query["history.organisation"] = doc.organisation;
var update = db.users.findAndModify({
    "query": query,
    "update": { 
        "$set": { 
            "history.$.name": doc.name,
            "history.$.organisation": doc.organisation
        }
    }
}); // return the document modified, if there's no matched document update = null

if (!update) {
    db.users.update(
        { "email": query.email },
        { "$push": { "history": doc } }
    );
}

查询此文档的此集合

db.users.find({ "email": "email@address" });

会产生

Output:

{
    "_id" : ObjectId("575fe85bfe98c1fba0a6e535"),
    "email" : "email@address",
    "__v" : 0,
    "history" : [ 
        {
            "name" : "Test123",
            "organisation" : "Rat",
            "field" : 4,
            "another" : 3
        }, 
        {
            "name" : "foo",
            "organisation" : "bar"
        }
    ]
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果条目不包含两个匹配的字段,则 mongo 添加到嵌套数组 的相关文章

  • MongoDB:如何在嵌套数组中更新插入对象?

    考虑以下文档 countries country France cities city Paris population 100 country England cities city
  • python - 如何使用for循环重新分配数组中的元素

    我有一个 numpy 浮点数组 我想使用 for 循环重新分配不同的值 但 PyCharm 表示未使用新的变量分配 如果我有 请说 for i in array i i 5 它会说 i 是一个未使用的变量 我究竟做错了什么 您需要为数组元素
  • mongodb从不同数据库中选择

    我有大约 200 个 mongodb 数据库 每个数据库都有一个名为 Group 的集合 在该集合中有一个名为 meldingId 的字段 是否可以进行一个 mongodb 查询来查找不同数据库中的所有值 我设法通过 selectDB da
  • 如何在 Meteor 应用程序之间共享 MongoDB 集合?

    我希望能够为我的项目提供一个管理应用程序和一个客户端应用程序 理想情况下 我希望能够拥有一个共享的 MongoDB 集合 我怎样才能做到这一点 我尝试在两个不同的应用程序中创建具有相同名称的集合 但发现 Meteor 会将数据分开 知道我能
  • PHP 数组到 JavaScript 数组

    假设我在 php 中有这个数组 cities array Caracas gt array air gt array 4 3 5 Working Days Saturday sea gt array 18 3 5 Days Wednesda
  • PHP—array_merge_recursive() - 相同键没有数组

    php a php gt data1 tag gt div classes gt 1 2 3 php gt data2 tag gt section classes gt 2 3 4 5 6 php gt result array merg
  • MongoRepository动态查询

    我有以下问题 假设我有以下模型对象 class Person String id String firstName String lastName Map
  • 实现软删除的最佳方法是什么?

    目前在做一个项目 我们要对大部分用户 用户角色 实现软删除 我们决定添加一个is deleted 0 数据库中每个表的字段并将其设置为 1 如果特定用户角色点击特定记录上的删除按钮 现在为了将来的维护 每个SELECT查询需要确保它们不包含
  • WordPress 中的 add_action 函数

    嗯 我正在学习创建一个 WordPress 插件 我下载了一个并阅读了代码 然后我看到了这个 我假设 foo 是它将添加操作的标签 但是 array 到底是做什么的呢 add action foo array foo1 foo2 我在看ht
  • 如何使用 django ORM 在外键字段上连接两个表?

    假设我有以下模型 class Position models Model name models CharField class PositionStats models Model position models ForeignKey P
  • 如何通过 SQL 表关联 SQL 中的实体

    我是数据库设计的初学者 我需要为项目创建数据库 我可以用面向对象的术语解释我想要做什么 值得庆幸的是 数据库专家会很友善地向我解释如何在数据库方面处理这个问题 我想创建一个与位置实体 州 城市 有关系的用户 ID 名称 实体 所以在编程语言
  • SQL 连接两个没有关系的表

    我有具有相同结构的不同表 我想通过其中一列将它们连接起来 问题是他们不共享该专栏中的信息 Table 1 Type A Name Value Table 2 Type B Name Value 结果表 在单列中 nameFromA name
  • 在 VB.Net 中将字节数组转换为整数

    我想知道在 vb net 中将字节数组 长度 4 转换为整数的最佳方法是什么 我知道 BitConverter 但执行函数调用来执行应该可以通过复制 4 字节内存来完成的操作似乎相当浪费 同样 将单 双精度数从二进制表示形式转换为单 双精度
  • 无法在 Sqlite3 中添加默认值为 NULL 的 NOT NULL 列

    尝试将 NOT NULL 列添加到现有表时出现以下错误 为什么会发生这种情况 我尝试了 rake db reset 认为现有记录是问题所在 但即使重置数据库后 问题仍然存在 你能帮我解决这个问题吗 迁移文件 class AddDivisio
  • 交换关联数组中的两个项目

    Example arr array apple gt sweet grapefruit gt bitter pear gt tasty banana gt yellow 我想调换一下柚子和梨的位置 这样数组就变成了 arr array ap
  • MongoDB 按数组内部元素分组

    我有一个文章列表 每篇文章都有一个数组属性 其中列出了其中提到的各个个人 id oid 52b632a9e4f2ba13c82ccd23 providerName The Guardian url http feeds theguardia
  • 使用 python/numpy 重塑数组

    我想重塑以下数组 gt gt gt test array 11 12 13 14 21 22 23 24 31 32 33 34 41 42 43 44 为了得到 gt gt gt test2 array 11 12 21 22 13 14
  • Flutter 中有预填充数据库使用的示例吗?

    Flutter 中有预填充数据库使用的示例吗 我不需要 CRUD 示例 此时我只需要从数据库读取数据即可 我是 Flutter 新手 所以一步一步的教程会很好 您可以将您的应用程序与预填充的 sqlite 数据库捆绑在一起assets文件夹
  • 通知设置的数据库设计

    用户可以打开或关闭 他的通知设置 帐户 用于通知 例如 更改帐户资料信息 收到新消息等 通知可以通过电子邮件或手机 推送或短信 发送 用户可以只有 1 封电子邮件和多个手机设备 有什么方法可以改进以下数据库设计或者您会采取不同的方式吗 让我
  • pymongo MongoClient 连接到 ReplicaSet

    我采用 pymongo 的 MongoClient 类来连接到具有三个节点 1 个主节点 2 个辅助节点 的副本集 代码片段如下 c MongoClient secondary1 hostname secondary2 hostname r

随机推荐

  • Java - 赋值的左侧必须是变量

    我正在尝试制作一个小程序来定位不同的城市 作为我的第一个 Java 项目 我想从 城市 类访问 GPS 类的变量 但我不断收到此错误 赋值的左侧必须是变量 任何人都可以向我解释我在这里做错了什么以及如何避免将来出现此类错误 public c
  • 在没有软件包的情况下在 python 中实现 Haar 小波

    我正在尝试编写一个代码来实现离散小波变换 haar 小波 dwt 而不使用 python 中的包 到目前为止 我找到了一个链接 他们实现了类似的功能 该链接这个小波变换实现正确吗 运行时没有报错 但最终结果不正确 我运行的代码是 def d
  • 根据所选的货币代码设置货币格式,无论设备的区域设置如何 (Swift)

    我正在尝试根据用户选择的货币来格式化货币 如果未选择货币 则使用设备的当前区域设置进行格式化 但是 我遇到了问题 我正在使用数字格式化程序将双精度格式格式化为货币字符串 let formatter NumberFormatter forma
  • 如何在 Windows 7 中使用 C/C++ 将麦克风静音?

    我使用 WinAPI 编写了一个将麦克风静音的程序 它似乎在 Windows XP 中完美运行 但在 Windows 7 中不起作用 是否可以在 Windows 7 中使用 WinAPI 控制麦克风音量或静音 void setVolume
  • 使用 JS 从 html 表中的第一列搜索值?

    我有这张桌子 th Example No th th Column 1 th tr td 3512376894 td td email protected td tr 我有一个脚本可以按所有列搜索值 但我想做的就是仅使用 td id 按第一
  • python ctypes,通过引用传递双指针

    问题 我正在尝试使用具有以下原型的 C 库中的函数 int glip get backends const char name size t count The name这里的争论就是问题所在 它是一个通过引用传递的二维字符数组 在 C 语
  • 副本集 my-mongo-set 的新配置 1 中描述的主机没有映射到此节点

    我正在使用 Docker 设置 MongoDB 集群 我有一个 bash 脚本 它启动三个共享网桥的容器 以便它们可以相互通信 我可以连接到网络中的所有 MongoDB 数据库 NodeJS 脚本将集群成员添加到网络中 docker rm
  • AngularJS |使用 ng-class 的条件类

    我想将条件类应用于页面上的元素 目前它正在使用以下代码 ng class vfnz form error loginForm username invalid 如果输入字段无效 这将应用无效类 我想申请 valid 用户输入字段有效时的类
  • 使用 XDocument 生成具有多个命名空间的 XML

    我有这样的 XML
  • “connectedAndroidTest”任务成功后运行 gradle 任务 X

    我有一个等级taskX我想追寻的connectedAndroidTest任务完成 但前提是所有测试都通过connectedAndroidTest 我怎样才能做到这一点 你需要利用finalizedBy以及特定任务的状态检查 具体方法如下 t
  • Android 中下载队列中的文件

    如何将队列中的多个文件一一下载 我在用着this作为示例代码 因为 我将传递要从本地数据库动态下载字符串的 URL 请让我知道该怎么做 我希望应用程序启动后立即开始下载 请帮助我 Android 开发类型 新手下载队列的目的 应用内计费成功
  • new Date() 与 Date() 以及为什么它返回不同的时间(-2 小时)?

    我有这 2 个控制台日志 但它们返回的时间不同 2 小时关闭 console log new Date Date 2015 04 20T15 37 23 000Z console log Date Mon Apr 20 2015 17 37
  • Pandas 数据框:使用线性插值重新采样

    我正在尝试获得一种相当基本的重采样方法来处理 pandas 数据框 我的数据框 df 按日期时间条目索引并包含价格 price datetime 2000 08 16 09 29 55 755000 7 302786 2000 08 16
  • 规范化为 3NF(第三范式)时,可以将复合键和/或外键移动到其他表吗

    我的数据库设计目前处于 3NF 问题是外键 在某些情况下是复合键 如果与复合 外键关联的属性不依赖于主键 您是否可以移动复合键和 或外键来创建其他表 我怀疑答案是肯定的 因为这个链接 第三范式中是否包含外键 最佳答案 仅仅因为它是外键并不意
  • Jenkins - 使用curl获取最新的工件

    我一直在四处寻找 但找不到如何使用curl 下载最新的工件 甚至只是知道链接 我发现了永久链接和 api xml json 提要 其中包含所需的所有数据 例如工件名称等 还发现了压缩所有工件的特殊链接 但我的工件已经压缩了 有没有一种方法可
  • Wxpython 在主机启动时显示对话框

    我是一个使用 python 和 wxpython 的新人 我在主机启动后显示登录表单对话框时遇到问题 例如这张照片 所以如果用户没有登录 主机就无法访问 如果用户单击关闭 关闭按钮 它也会关闭主框架 请给我一个示例代码 import wx
  • 检索 subprocess.call() 的输出[重复]

    这个问题在这里已经有答案了 如何使用以下命令获取进程运行的输出subprocess call 通过一个StringIO StringIO反对stdout给出这个错误 Traceback most recent call last File
  • 如何在 .NET 5 控制台应用程序中处理任务管理器中的“结束任务”?

    我的 NET 5 控制台应用程序注册了处理例程通过使用设置ConsoleCtrlHandler 因此它可以在退出之前进行一些清理 这让我能够做出反应CTRL C CTRL BREAK ALT F4并使用关闭控制台X按钮 遗憾的是 当任务管理
  • 从 Oracle 表获取值计数

    我有一张表 其中包含员工 由于我工作的公司相当大 gt 3k 员工 其中一些人具有相同的名字是很自然的 现在可以通过用户名来区分他们 但由于网页需要包含所有这些用户的下拉菜单 因此我需要在他们的姓名中添加一些额外的数据 我知道我可以首先获取
  • 如果条目不包含两个匹配的字段,则 mongo 添加到嵌套数组

    我有一个 mongo 文档 其中包含一个名为 History 的数组 id ObjectId 575fe85bfe98c1fba0a6e535 email email address v 0 history name Test123 org