mongodb聚合获取数组中负序的最大数量

2024-03-10

我需要通过聚合从数组中获取负序列的最大计数,示例文档:

  {
  "id": 1,
   x: [ 1,1,-1,-1,1,1,1,-1,-1,-1,-1]
 },
 {
"id": 2,
  x: [ 1,-1,-1,1,1,1,-1 ]
 }

预期结果:

 {"id": 1,x:4},
 {"id": 2,x:2}

请指教?


您可以使用$reduce https://docs.mongodb.com/manual/reference/operator/aggregation/reduce/迭代数组并$cond https://docs.mongodb.com/manual/reference/operator/aggregation/cond/应用你的逻辑(连续否定)

载体格式正确

     {
        previous: // previous value to compare for continuity 
        acc: // number of consecutive negatives in the current sequence
        max: // length of the longest sequence
      }

$let https://docs.mongodb.com/manual/reference/operator/aggregation/let/是记住当前累加器以在最大值计算中重用。它是可选的但很方便:

db.collection.aggregate([
  {
    "$set": {
      "x": {
        "$reduce": {
          "input": "$x",
          "initialValue": {
            previous: 0,
            acc: 0,
            max: 0
          },
          "in": {
            $let: {
              vars: {
                result: {
                  "$cond": {
                    "if": {
                      "$and": [
                        {
                          "$lt": [
                            "$$this",
                            0
                          ]
                        },
                        {
                          "$lt": [
                            "$$value.previous",
                            0
                          ]
                        }
                      ]
                    },
                    "then": {
                      "$add": [
                        "$$value.acc",
                        1
                      ]
                    },
                    "else": {
                      "$cond": {
                        "if": {
                          "$lt": [
                            "$$this",
                            0
                          ]
                        },
                        "then": 1,
                        "else": 0
                      }
                    }
                  }
                }
              },
              in: {
                previous: "$$this",
                acc: "$$result",
                max: {
                  "$cond": {
                    "if": {
                      $gt: [
                        "$$value.max",
                        "$$result"
                      ]
                    },
                    "then": "$$value.max",
                    "else": "$$result"
                  }
                }
              }
            }
          }
        }
      }
    }
  },
  {
    "$set": {
      x: "$x.max"
    }
  }
])

试试mongoplayground.net https://mongoplayground.net/p/LP0e3ppgOtt.

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

mongodb聚合获取数组中负序的最大数量 的相关文章

随机推荐

  • 如何使用brew cask指定版本?

    安装某些东西时如何指定版本号brew cask install 对于最新版本的 Homebrew 下面是杰思罗的指示 https stackoverflow com a 58373705 8280495可能不起作用 因为我们会收到如下错误
  • 将 DateTime 值作为参数传递给 OleDbCommand

    我在将 DateTime 值作为 DbParameter 传递给查询时遇到问题 看来 DateTime 值的时间部分被剥夺了 下面是 C 中的示例代码 DbProviderFactory factory OleDbFactory Insta
  • 在 Metal Shading Language 中创建全局可访问的常量缓冲区

    我有一个关于 Metal 中的常量缓冲区的问题 假设我有类似的东西 list of includes goes here using namespace metal struct ConstantBuffer float ANY VALUE
  • 如何在我的 docker 映像中安装 python-tk [重复]

    这个问题在这里已经有答案了 当我在 docker 映像中运行 python 脚本时出现此错误 ImportError No module named tkinter please install the python tk package
  • 将 numpy 加载到 IronPython 中

    我最近安装了 Ironpython 工具 但在加载外部模块 numpy 时遇到问题 这是我的测试代码 import numpy numpy test 当编写我的简单测试时 智能感知找不到 numpy 但是当它从 vs2010 运行时 我得到
  • 将 opencv 仿射矩阵转换为 CGAffineTransform

    我想采用 OpenCV 中的仿射矩阵 Mat T getAffineTransform src pt dst pt 然后将其转换为 CGAffineTransform 以在 Core Graphics Objective C iOS 中使用
  • Postgresql 在删除行之前创建触发器

    所以我有这两个表 Table user columns id name surname password token earnedmoney Table addlisting columns id user fk price date ad
  • java中如何初始化动态数组?

    如果我有一个类需要返回可变维度的字符串数组 并且该维度只能在运行该类的某些方法时确定 那么如何在类的构造函数中声明动态数组 如果问题还不够清楚 在 php 中我们可以简单地声明一个字符串数组为 my string array array 并
  • 如何在 Kotlin 数据类字段上列出(java)注释?

    我使用 Firestore 的基于 Java 的注释来标记字段和将文档字段映射到 Java 类元素的方法 Retention RetentionPolicy RUNTIME Target ElementType METHOD Element
  • javascript - 迄今为止的字符串 - php iso 字符串格式

    我有一个日期格式为 2010 11 30T08 32 22 0000 2010 11 27T20 59 17 0000来自 feed 以字符串格式转换为 javascript 现在我想将其转换为 Date 对象 我怎样才能用 JavaScr
  • 使用 JavaScript 将字符串分成多个变量

    使用 JavaScript 我想获取这样的字符串var hashStr modal 123456 并分配左边的字符串 到一个变量和右边的字符串 到另一个变量 如果字符串不包含 然后忽略它 我怎样才能最好地实现这一目标 var hashStr
  • 添加文本时的转换表单元格宽度

    我有一个表格单元格 其中包含一些文本 td Text in here td 我无法使用 CSS 设置宽度 因为我不知道同一列中的其他单元格中有多少数据 但是 当我的 Javascript 将新代码插入表中时 我想为 CSS 中的宽度属性设置
  • Oh-my-posh 主题无法与 Powerline 字体和 ConEmu 一起正常工作

    I use PowerShell as my shell on Windows 7 I find that ConEmu is a really good terminal Since I am not on Windows 10 I ca
  • 如何使用 IntelliJ 设置 libgdx?

    我跟着this https github com libgdx libgdx wiki Gradle and Intellij IDEA教程 但似乎有点过时了 我不知道 不幸的是 我对 Java 的经验不是很丰富 但对 C Python 所
  • Javascript:如何检查 URL 是否包含单词

    我想检查浏览器中的 URL 是否包含单词 桌面 我从桌面启动 html 文件 它的网址是 file C Users Joe Desktop TestAlert html 但应该会出现一个警报 但这不起作用 这是我的代码 h1 Test001
  • 动态设置用户任务受让人

    我必须在 activiti 中创建需要以下用例的流程 1 表单有一个人员搜索字段 2 当有人填写表单并使用填充姓名的人员搜索字段完成任务时 我需要将分配的下一个任务的名称设置为可以对下一个任务执行操作的用户 如何使用 activiti 引擎
  • android中什么时候绘制视图?

    我想获取活动中视图的大小 但无法在任何活动生命周期回调 onCreate onStart onResume 中获取该信息 我假设这是因为视图尚未绘制 在什么时候绘制视图 是否有回调我可以放置我的代码以便获得视图的大小 findViewByI
  • Quarkus 替代 spring-data-jdbc

    默认DAO层 ORM框架中Quarkus is Panache 在 Hibernate 之上 这很奇怪 因为我没有找到任何可插入外部 L2 缓存实现 如 Redis 的内置集成 夸库斯被称为cloud native但在实际系统中 使用默认的
  • 如何使用 cURL 在 php 中发布表单数据?

    我有以下命令 它使用 form F 选项 我知道它正在工作 curl form file home USERNAME import csv https apiprovider com api v0 imports token KEY 我需要
  • mongodb聚合获取数组中负序的最大数量

    我需要通过聚合从数组中获取负序列的最大计数 示例文档 id 1 x 1 1 1 1 1 1 1 1 1 1 1 id 2 x 1 1 1 1 1 1 1 预期结果 id 1 x 4 id 2 x 2 请指教 您可以使用 reduce htt