查找嵌套数组中符合条件的第一个元素

2023-12-24

我有以下文件:

doc1: { 
  'array': [
    {'field': 'ABC', 'enabled': 'false'},
    {'field': 'BCD', 'enabled': 'true'},
    {'field': 'DEF', 'enabled': 'false'},
    {'field': 'XYZ', 'enabled': 'true'},
  ]
}


doc2: { 
  'array': [
    {'field': 'ABC', 'enabled': 'true'},
    {'field': 'BCD', 'enabled': 'true'},
    {'field': 'DEF', 'enabled': 'false'},
    {'field': 'XYZ', 'enabled': 'true'},
  ]
}

我正在按特定字段执行搜索。 我想要获取启用此字段的所有文档,并且在此之前(在列表中)没有启用其他字段。

For ex.:

搜索字段:BCD,enabled: true - 应该只返回第一个文档(因为在第二个文档中ABC也已启用)。

搜索XYZ,enabled: true - 根本不应该返回任何文档,因为在此列表顶部还启用了其他字段。

我试图做某事$elemMatch,但我不知道是否可以在元素之上应用过滤器elemMatch已匹配。

有什么建议么?


最好使用搜索$where https://docs.mongodb.com/manual/reference/operator/query/where/除了正常的查询之外,仍然将内容保留在服务器上:

db.getCollection('collection').find({
  "array": {
    "$elemMatch": { "field": "BCD", "enabled": "true" },
  },
  "$where": function() {
    return this.array.map((e,i) => Object.assign(e,{ i }))
      .filter( e => e.field === "BCD" && e.enabled === "true" )
      .map( e => e.i )[0] <=
    this.array.map(e => e.enabled).indexOf("true")
  }  
})

如果您有 MongoDB 3.4 支持$indexOfArray https://docs.mongodb.com/manual/reference/operator/aggregation/indexOfArray/ and $range https://docs.mongodb.com/manual/reference/operator/aggregation/range/,那么它可能看起来更长,但实际上最有效$redact https://docs.mongodb.com/manual/reference/operator/aggregation/redact/:

db.getCollection('collection').aggregate([
  { "$match": {
    "array": {
      "$elemMatch": { "field": "BCD", "enabled": "true" },
    }
  }},
  { "$redact": {
    "$cond": {  
      "if": {
        "$lte": [
          { "$arrayElemAt": [
            { "$map": {
              "input": {
                "$filter": {
                  "input": {
                    "$map": {
                      "input": {
                        "$zip": {
                          "inputs": [
                            "$array",
                            { "$range": [0, { "$size": "$array" }] }
                          ]
                        }    
                      },
                      "as": "a",
                      "in": {
                        "field": { "$arrayElemAt": [ "$$a.field", 0 ] },
                        "enabled": { "$arrayElemAt": [ "$$a.enabled", 0 ] },
                        "index": { "$arrayElemAt": [ "$$a", 1 ] }    
                      }
                    }
                  },
                  "as": "a",
                  "cond": {
                    "$and": [
                      { "$eq": [ "$$a.field", "BCD" ] },
                      { "$eq": [ "$$a.enabled", "true" ] }
                    ]
                  }    
                }
              },
              "as": "a",
              "in": "$$a.index"  
            }},
            0
          ]},
          { "$indexOfArray": [ "$array.enabled", "true" ] } 
        ] 
      },
      "then": "$$KEEP",
      "else": "$$PRUNE"
    }
  }}
])

因此,确实没有实际的查询操作来强制执行此操作,但这两种情况都将选择保留在“服务器上”,而不是通过线路将数据发送到客户端然后进行过滤。

因为如果你这样做,它首先就否定了使用数据库的目的。所以你确实希望这发生在服务器上。

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

查找嵌套数组中符合条件的第一个元素 的相关文章

  • mongo docker 镜像创建后未运行脚本

    我使用 docker compose 为前端 后端和 mongo 实例创建 3 个不同的容器 其中三个正在运行并在它们之间连接 但我需要在 mongo 实例运行后立即在数据库上创建一个管理员用户 根据 mongo 图像文档 每个脚本位于do
  • mongoid 中的嵌入文档与哈希数据类型

    我找不到任何讨论此问题的博客文章或文档 它们 嵌入式文档和哈希数据类型 非常相似 彼此相比有何好处或限制 考虑我的架构设计 class HistoryTracker include Mongoid Document include Mong
  • 创建永远不匹配的 mongo 表达式的最佳方法

    我正在寻找的内容在某种程度上相当于在 SQL 中执行的操作 WHERE 1 0 我正在寻找这样的东西 因为我正在构建一个类型安全的 DSL 来在我的域上执行查询 支持连接和析取 有时 添加一个从不匹配任何内容的查询可能比在代码中处理它更容易
  • 将 mongo 数组转换为具有键值对的对象

    我有一个包含字符串数组的 mongo 文档 我需要将这个特定的字符串数组转换为包含键值对的对象数组 以下是我目前的做法 id ObjectId 57e3720836e36f63695a2ef2 platform A1 available C
  • Mongoose查询结果是只读的吗?

    如何修改 Mongoose 查询返回的对象 假设我们有以下模式 var S new mongoose Schema name String field String 我对结果进行了以下查询和修改 var retrieve function
  • Mongo $group 和 $project

    我正在尝试获取关键字计数parentId categioryId and llcId 我的数据库是 id ObjectId 5673f5b1e4b0822f6f0a5b89 keyword electronic content manage
  • Mongoose 4.4.12 中 Schema 方法范围内的“this”为空 {}

    当在 Schema 方法内记录到控制台时 对象 this 为 这发生在一天前 我一直在阅读教程和其他堆栈溢出问题 但不幸的是我没有找到原因的解决方案 这是我的模型 var mongoose require mongoose var Sche
  • 如何修复 MongoClient is not a constructor 错误

    我刚刚学习 JavaScript 和 Nodejs 根据我在网上找到的一些代码 我编写了以下应用程序 当我尝试运行它时 我在第 9 行收到错误 其中显示 new MongoClient 错误提示 MongoClient 不是构造函数 您能解
  • mongoengine 操作的原子性如何

    我正在尝试在对象的状态之间转换 如下所示 User objects id user id state STATE WAITING update one set state STATE FINISHED The question是 是否存在这
  • 为关联数组选择哪种映射类型?学说ODM

    我有一个关于 顺便说一句 真的很棒 Doctrine ODM 的简单问题 假设您有一个类似以下的文档 Document class Test Id public id WHICHTYPE public field array 现在我想存储一
  • Spring Data mongodb:添加 MongoDb 访问凭据

    我的 Spring 应用程序中有以下工作配置
  • MongoDB 中两个集合之间的 Diff()

    我做过研究 如果这是一个重复的问题 我很抱歉 但其他问题的解决方案并不适合我 因此 我提出了一个新问题 使用 Javascript 比较两个集合的最佳方法是什么 我有数千个这样的 Mongo 文档格式的标头 url google com h
  • MongoDB 嵌套数组查询

    我问这个作为评论another https stackoverflow com questions 5250652 query a nested array in mongodb问题 还发了一个question https groups g
  • 如何在 Spring MongoDB 聚合上投影 DBRef?

    我在 MongoDB shell 中完成了以下聚合 以获取每个用户每种类型的警报数量 db getCollection alerts aggregate unwind son group id son son level level cou
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • mongodb使用skip和limit排序不根据索引对记录进行排序

    我正在尝试使用 Mongodb 进行分页skip and limit 我想要按顺序获取页面记录register time 在数据库中 记录是按索引排序的 而不是按register time 如何使多页记录 多次跳转 遵循相同的内容regis
  • 如何确定 STARTUP2 BTree Bottom Up 步骤的总体进度?

    确定新次要成员的初始同步 STARTUP2 的索引构建阶段的总体进度的好方法是什么 在我的例子中 索引构建阶段需要很长时间 几天 如果能够看到它在这个过程中的进度 那就太好了 日志输出如下所示 Tue Jan 27 20 04 45 006
  • Mongoose 总是返回空数组? [复制]

    这个问题在这里已经有答案了 我是nodejs i的新手 我已经有一个名为aqi的数据库 集合名称为pln 我试图在网页上显示集合中的所有记录 但猫鼬总是返回空数组 我已经用其他数据库测试了它 但我可以从它们获取数据 但对于 pln mong
  • 访问 Amazon EC2 上的 Mongodb 时出现问题

    我还有一个问题要问你 我有安装了 mondodb 的 Amazon EC2 实例 它工作得很好 除了一件事 我无法从外部 我的电脑 访问 连接到 它 我认为安全组的问题 这是某种默认防火墙 有谁知道如何配置EC2实例来访问mongodb 提
  • 缩短node.js和mongoose中的ObjectId

    我的网址目前如下所示 http www sitename com watch companyId 507f1f77bcf86cd799439011 employeeId 507f191e810c19729de860ea someOtherI

随机推荐

  • Elixir 的“混合格式”配置选项

    我试图找到一个混合格式的可配置选项列表以放入格式化程序配置文件中 但我一生都找不到它 它不在混合格式文档或我看过的其他任何地方 有人知道我在哪里可以找到这些信息吗 事实证明mix format没有太多的选项可以设置 你在上面看到的混合文档页
  • java中的String hashCode是预先计算好的吗?

    当我说Java时 String str abcd str hashCode 我的问题是Hashcode什么时候计算 第1行还是 第2行 我假设哈希码是预先计算的 每当字符串更新时 哈希码也会 也许 更新 或者是另一种方式 即每次你打电话时s
  • 如何定位数组中的负数,以获得所有正数的总和?

    我试图弄清楚如何定位数组中的负数 我有这个 function SummPositive array SummPositive 1 2 3 4 5 2 23 1 13 10 52 这是一个包含负数和正数的数组 当我不知道数组中有多少个负数时
  • php:按键值迭代函数参数

    我有一个 php 函数function foo bar1 bar2 bar3 是否有可能获取参数名称和值动态地 I found func get args http php net manual de function func get a
  • 我可以使用 Google Script API 部署绑定脚本吗

    Google 最近发布了新的 Google Script API 我认为这是一个实现期待已久的项目的好机会 上下文如下 企业 GSuite 域中的一些用户共享约 100 张具有相同目的的表 我想用侧边栏来增强这些工作表 以显示附加信息等 我
  • 如何在 Qt 中解析 XML 字符串

    我正在开发一个应用程序 在创建 Web 服务后 我收到了来自服务器的响应 该响应位于 XML 标记中 响应 r n
  • 递归地应用复杂的泛型类型

    谢谢一个答案 https stackoverflow com questions 58409603 generate a type where each nullable value becomes optional来自 Nit 我有一个通
  • 在reactjs中将字符串作为html

    我有一个返回多行 html 的函数 如下所示 render function var badges user get achievements badges map function badge var str h3 span span h
  • 在命令窗口中禁用自动滚动

    我在 Matlab 中编写的许多代码都有非常详细的输出 当程序运行时 信息被打印到命令窗口 并且每换行一次 窗口就会自动滚动到底部 当我想更仔细地阅读一些输出或向上滚动以查看较旧的输出时 这会成为一个问题 我可以向上滚动 但只能直到打印出新
  • 在 Delphi 中通过 COM 对象使用 .Net 类有时会挂起

    我有一组用 Delphi NET NET 1 1 编写的库 我想在我的 Win32 Delphi 应用程序中使用它们 对于与性能相关的问题 我决定采用 COM 路线 有时 在重建 DLL 后 当我尝试实例化通过 COM 公开的对象时 Win
  • 如何在没有配置的情况下设置分页链接的样式 - codeigniter

    我有以下分页样式 ul class pagination li a href i class fa fa long arrow left i Previous Page a li li class active a href 1 a li
  • 我有一个程序,我想比较带来日期并带来所需的数据

    我将所有详细信息写在我有两个名为 GAZZETED DAYS 的表 其中包含列 GAZZETED DATE DESCRIPTION PAY IN OUT 包含列 EMP CODE ATT DATE 请检查我已经粘贴在 dbfiddle 中的
  • 从 Azure Blob 存储下载文件

    我有一个应用程序 允许用户上传存储在 Azure Blob 存储中的照片 用户还可以查看这些照片 要查看它们 我们希望应用程序将图像下载到默认下载位置 目前 上传工作完美 但我发现Azure API的下载功能似乎没有做任何事情 另外 我无法
  • 在显示用户数据的视图表中更改和保存 mysql 用户数据

    我有一个表 显示从 mysql 表中获取的用户数据 我希望使其可以在该表的单元格内编辑 我已经使用 php 在 文本 类型输入字段中显示数据 如代码所示 为了重新提交更改的数据 我将表行包装在表单中 但问题是表单数据没有重新提交 我想让用户
  • Fluent nHibernate 自动映射属性为 nvarchar(max)

    使用流畅的 nhibernate 和自动映射 nhibernate 创建我的数据库模式 我如何让 nhibernate 基于以下类在数据库中创建 nvarchar max 列 public class VirtualPage BaseEnt
  • C# 中的动态字符串格式化

    我创建了接受字符串的 log 方法 当我想使用它时 我会写这样的内容 Log string Format Message 0 AdditionalInfo 我应该如何实施Log方法以便能够使用字符串Format但不必在方法参数中显式编写 L
  • 404 Not Found,但 Laravel 5.4 中存在路由

    我正在使用 PhpStorm 我可以运行并打开index php 但是当我想按提交按钮 登录后 时 它显示 404 未找到 在 Windows 10 上运行的 Web 服务器 Apache 2 4 这是我的家 这是我的路线 我不完全确定为什
  • .dynamicType 已弃用。使用“类型(...)”代替

    我刚刚更新到 Xcode 8 和 iOS 10 使用旧版 Swift 语言版本 尝试再次编译我的项目一直是一种痛苦 即使仍然使用旧的 Swift 语法 这次我的函数之一使用NSBundle forClass self dynamicType
  • 如何调试从完全信任进程启动器启动的 .exe

    我在同一解决方案中构建了一个 UWP 应用程序和一个 WPF 应用程序 我正在使用 FullTrustProcessLauncher 类从 UWP 应用程序启动 WPF 应用程序 我还使用 App Service Connection 类来
  • 查找嵌套数组中符合条件的第一个元素

    我有以下文件 doc1 array field ABC enabled false field BCD enabled true field DEF enabled false field XYZ enabled true doc2 arr