如果在数组中找不到匹配项,则返回第一个元素

2024-01-01

我有以下文件:

{
    _id: 123,
    state: "AZ",
    products: [
        {
            product_id: 1,
            desc: "P1"
        },
        {
            product_id: 2,
            desc: "P2"
        }   
    ]
}

我需要编写一个查询以从产品数组中返回单个元素,其中状态为“AZ”且product_id 为2。如果未找到匹配的product_id,则返回产品数组中的第一个(或任何)元素。

例如:如果 Product_id 为 2(找到匹配项),则结果应为:

products: [
    {
        product_id: 2,
        desc: "P2"
    }   
]

如果product_id为3(未找到),则结果应为:

products: [
    {
        product_id: 1,
        desc: "P1"
    }   
]

当找到匹配项时,我能够满足一个条件,但不确定如何满足同一查询中的第二个条件:

db.getCollection('test').find({"state": "AZ"}, {_id: 0, state: 0, products: { "$elemMatch": {"product_id": "2"}}})

我也尝试使用聚合管道,但找不到有效的解决方案。

注意:这与以下问题不同,因为如果找不到匹配项,我需要返回默认元素:仅检索 MongoDB 集合中对象数组中的查询元素 https://stackoverflow.com/questions/3985214/retrieve-only-the-queried-element-in-an-object-array-in-mongodb-collection


您可以尝试下面的聚合

基本上你需要$filter https://docs.mongodb.com/manual/reference/operator/aggregation/filter/ the products数组并检查$cond https://docs.mongodb.com/manual/reference/operator/aggregation/cond/如果它不包含任何元素或等于[]那么你必须$slice https://docs.mongodb.com/manual/reference/operator/aggregation/slice/的第一个元素products array.

db.collection.aggregate([
  { "$addFields": {
    "products": {
      "$cond": [
        {
          "$eq": [
            { "$filter": {
              "input": "$products",
              "cond": { "$eq": ["$$this.product_id", 2] }
            }},
            []
          ]
        },
        { "$slice": ["$products", 1] },
        { "$filter": {
          "input": "$products",
          "cond": { "$eq": ["$$this.product_id", 2] }
        }}
      ]
    }
  }}
])

甚至使用$let https://docs.mongodb.com/manual/reference/operator/aggregation/let/聚合

db.collection.aggregate([
  { "$addFields": {
    "products": {
      "$let": {
        "vars": {
          "filt": {
            "$filter": {
              "input": "$products",
              "cond": { "$eq": ["$$this.product_id", 2] }
            }
          }
        },
        "in": {
          "$cond": [
            { "$eq": ["$$filt", []] },
            { "$slice": ["$products", 1] },
            "$$filt"
          ]
        }
      }
    }
  }}
])
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如果在数组中找不到匹配项,则返回第一个元素 的相关文章

随机推荐

  • Python 字典包含编码值

    我有一个熊猫数据框oParameterData我使用 Hive ODBC 连接在 Hadoop 上构建了查询 我用它来填充一个名为的 Python 字典oParameter import pyodbc import pandas oConn
  • iOS - 如何在更改视图时停止背景音乐

    如何在改变视图时停止背景音乐 我没有任何线索 如果我按下一个按钮 将我带到一个新的视图 就会有新的背景音乐 但旧的背景音乐 无限循环 仍在继续 请帮忙 还请示例一些代码 这是我的 void viewDidLoad NSString path
  • 使用 PDO 获取插入和更新 ID

    我想得到mysql insert id使用 PDO 到目前为止 我还没有找到一个可以同时用于插入和更新的好例子 有人有一段完整的代码作为示例吗 If you need pdo gt lastInsertId 要返回刚刚更新的行的 id 如果
  • 下一次部署仅在 Amplify 上失败

    我尝试在 AWS Amplify 上部署 Next js 应用程序 但始终失败 构建在本地环境中运行得非常好 我什至成功地在 Vercel 上部署 但它只在放大上失败 我能够通过创建一个来部署 babelrc文件 但我正在寻找保留 SWC
  • 没有为与上下文路径 [/Struts2Test] 关联的名称空间 [/] 和操作名称 [login] 映射的操作

    我是 Struts2 的初学者 我知道这个问题在这里被问了很多次 但我试图解决它并在这里阅读了很多线程 花了 6 个小时 但仍然无法让它工作 确实需要更多建议 这是我的包裹 Struts2Test Struts2Test src tw co
  • TeamCity 提供静态 HTML 页面

    我正在寻找一种使用 TeamCity 提供一些静态 HTML 页面的方法 如果不是绝对必要的话 我不想为此设置 apache 有谁知道访问静态 HTML 内容的简单方法 或 URL 方案 我找到了以下插件 但它只在现有页面的某些位置插入 H
  • 从菜单中隐藏应用程序并在需要时显示

    我想从主菜单隐藏我的应用程序 当用户愿意时 他 她可以看到他们的应用程序 为了隐藏应用程序 我删除了启动器类别 现在应用程序被隐藏 但现在我不明白用户如何启动应用程序 我在某处读到 使用组合键 在 DialerPad 上 可以显示活动的主屏
  • perf stat 为每次运行提供不同数量的指令

    我对以下空程序进行了性能分析 include
  • 如何将 css 类添加到特定的 symfony2 表单选项?

    我可以使用 Javascript 做到这一点 但我想知道是否可以将 css 类添加到特定的 symfony2 表单选择 不是选择字段本身 而是单个选择 例如 我想将不同的 css 样式应用于 选择 内的各个 选项 标签 我只能找到一种方法来
  • 动态加载Extjs模块化应用程序

    我正在使用 Extjs5 开发一个大型客户端应用程序 每个模块上都有非常复杂的视图 我已经在 Extjs 中开发了应用程序 但它们都编译为单个 app js 文件 因此 根据所有应用程序模型中视图的复杂性 我估计应用程序的大小即使在编译后也
  • 使用 JUnit4 进行测试时,Spring @transactional 不会启动事务

    我有以下配置
  • 了解 jQuery 返回对象

    我试图了解 jQuery 在搜索 DOM 元素时如何创建返回对象 我已经浏览了来源 但我不完全确定我理解 并希望这里有人能给我一些见解 从我收集到的阅读源代码来看 当查询 jQuery DOM 时 jQuery 会找到匹配的 DOM 元素
  • 使用文本函数或查找和替换来重命名多列的简单方法

    有没有一种简单的方法可以使用文本函数 例如Text Upper https learn microsoft com en us powerquery m text upper or Text Proper https learn micro
  • 使用 matplotlib 组合两个独立图的最佳方法是什么?

    我不断地问自己这个问题 如何以模块化的方式将不同的绘图与 matplotlib 轻松组合 比方说 我编写了一个显示图形节点位置的函数 同时 我制作了另一个绘制一些多边形的函数 现在 组合输出的正确方法是什么 使节点看起来位于多边形内部 改变
  • Delphi 汇编器常量 'eof'

    似乎有一个未记录的常量eof在 asm 块上下文中 这是使用 Delphi 7 进行测试的 program TestEof APPTYPE CONSOLE var example Integer begin asm mov example
  • React.js 上 img 的正确路径

    我的反应项目中的图像存在一些问题 事实上 我一直认为 src 属性的相对路径是建立在文件架构之上的 这是我的文件架构 components file1 jsx file2 jsx file3 jsx container img js 但是我
  • 用homebrew安装后无法启动mysql

    我有一台 Mac Air 运行 OS X 10 6 8 10K540 和 homebrew 0 8 我已经安装了 MySqlbrew install mysql 我已按照 homebrew 给出的说明进行操作 具体来说 unset TMPD
  • Python:当你只有方法的字符串名称时,如何调用方法?

    这是用于 JSON API 的 我不想拥有 if method str method 1 method 1 if method str method 2 method 2 由于显而易见的原因 这不是最佳的 我将如何以可重用的方式使用映射字符
  • 根据多行的存在(序列号)从 SQL 中选择所有行

    假设我有类似于以下内容的表数据 123456 John Doe 1 Green 2001 234567 Jane Doe 1 Yellow 2001 234567 Jane Doe 2 Red 2001 345678 Jim Doe 1 R
  • 如果在数组中找不到匹配项,则返回第一个元素

    我有以下文件 id 123 state AZ products product id 1 desc P1 product id 2 desc P2 我需要编写一个查询以从产品数组中返回单个元素 其中状态为 AZ 且product id 为2