Mongodb,$sum 有条件

2024-01-07

文件:

[
  {
    name: 'abc'
    length: 25,
    area: 10
  },
  {
    name: 'abc',
    length: 5
  }
]

聚合查询后的输出:

[
  {
     count: 2,
     summarizedLength: 30,
     summarizedArea: null,
     _id: {
       name: 'abc'
     }
  }
]

The length and area应该总结一下。但前提是所有文件都有area or length财产。

所以如果有的话length分组属性中缺少属性,summarizedLength值应该是null/undefined/not exisitng,并且与相同area.

我试过这个:

let query = mongoose.model('mycollection').aggregate([
    {
      $group: {
        _id: {
          name: $name
        },
        count: {
          $sum: 1
        },
        summarizedLength: { $sum: "$length" },
        summarizedArea: { $sum: "$area" },
      }
    }
  ]);

问题是,我需要取消$sum如果有任何财产丢失。这可能吗?


来自蒙戈文档$sum 行为 https://docs.mongodb.com/manual/reference/operator/aggregation/sum/#non-numeric-or-non-existent-fields

如果用于同时包含数字值和非数字值的字段, $sum 忽略非数字值并返回数字的总和 价值观。

如果用于任何文档中不存在的字段 集合,$sum 对该字段返回 0。

如果所有操作数都是非数字,则 $sum 返回 0。

we can $push所有面积和长度到数组,并比较count与数组的长度

db.n.聚合(

    [ 
        {
            $group: {
                _id: { name: "$name" }, 
                count: { $sum: 1 }, 
                area : {$push : "$area"}, 
                length : {$push : "$length"} } 
        },
        {
            $project:{
                _id: "$_id",
                count: "$count",
                summarizedLength: { $cond : [ {$eq : [ "$count", {$size : "$length"} ]} , { $sum : ["$length"] }, "not all numbers" ] },
                summarizedArea: { $cond : [ {$eq : [ "$count", {$size : "$area"} ]} , { $sum : ["$area"] }, "not all numbers" ] },
            }
        }
    ] 
)

或者,我们可以计算defined长度和面积以及总面积count,如果计数匹配,则所有数字其他数字未定义。

要严格检查类型,以防面积和长度可能包含非数字数据,而不是undefined我们可以做的$type check

db.n.aggregate(
    [
        {
            $group: {
                _id: { name: "$name" },
                count: { $sum: 1 },
                areaCount : { $sum : { $cond : [ {$eq : [ "$area", undefined ]} , 0, 1 ] } },
                lengthCount : { $sum : { $cond : [ {$eq : [ "$length", undefined ]} , 0, 1 ] } },
                summarizedLength: { $sum: "$length"  },
                summarizedArea: { $sum: "$area"  }
            }
        },
        {
            $project : {
                _id : "$_id",
                count: "$count",
                summarizedLength: { $cond : [ {$eq : [ "$count", "$lengthCount" ]} , "$summarizedLength", "not all numbers" ] },
                summarizedArea: { $cond : [ {$eq : [ "$count", "$areaCount" ]} , "$summarizedArea", "not all numbers" ] },
            }
        }
    ]
).pretty()

output

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

Mongodb,$sum 有条件 的相关文章

  • Mongoose 查询:删除“_id”属性,在结果中保留虚拟属性“id”

    我正在运行 Express js 应用程序 并且有以下设置 模型 js var schemaOptions toJSON virtuals true toObject virtuals true var modelSchema new mo
  • Mongoose嵌入式文档更新

    我在嵌入式文档更新方面遇到问题 我定义的架构 var Talk new Schema title type String required true content type String required true date type D
  • 如何在Mongodb java驱动程序中编写多个group by id字段

    在下面的查询中 group id success success responseCode responseCode label label max timeStamp timeStamp 1 count responseCode sum
  • 带有卷的 docker 中的 Mongo db 持久化

    我正在尝试创建一个 mongo 数据库容器 但无法使数据持久化 这是我的 docker compose yml version 3 2 services mongodb image mongo 2 4 command smallfiles
  • PHP 中的 MongoDB - 如何将项目插入集合中的数组中?

    这必须很容易 但我似乎无法弄清楚 假设我有一个集合users这是集合中的第一项 id ObjectId 4d8653c027d02a6437bc89ca name Oscar Godson email email protected cdn
  • 获取对象数组中每个嵌套对象的虚拟属性?

    所以我知道如何获取单个虚拟属性 如 Mongoose 文档中所述 PersonSchema virtual name full get function return this name first this name last 但如果我的
  • 在 MongoDB 聚合的“addField”操作中使用“$count”

    我正在尝试找到聚合运算符的正确组合 以将标题为 totalCount 的字段添加到我的 mongoDB 视图中 这将为我提供聚合管道特定阶段的计数 并将其输出为每个文档的计数结果 count count 但最终我得到了一个具有此结果的文档
  • Mongoose 独特的验证不起作用。保存重复条目

    我正在开发一个 NodeJS 应用程序 其中express是框架 MongoDB是数据库 我正在使用猫鼬插件 我有一个父母模型 我已经添加了独特 真实到场 mobile 但是每当我添加相同的手机号码时 唯一性验证就会失败 除了保存重复的文档
  • 是否可以提高 Mongoexport 速度?

    我有一个 1 3 亿行的 MongoDB 3 6 2 0 集合 它有几个简单的字段和 2 个带有嵌套 JSON 文档的字段 数据以压缩格式 zlib 存储 我需要尽快将其中一个嵌入字段导出为 JSON 格式 然而 mongoexport 需
  • 使用 MongoDB 和 Nodejs 插入和查询日期

    我需要一些帮助在 mongodb 和 nodejs 中按日期查找记录 我将日期添加到抓取脚本中的 json 对象 如下所示 jsonObj last updated new Date 该对象被插入到 mongodb 中 我可以看到如下 la
  • 调用 Mongoose 插件内模式的静态方法

    我写了一个插件 可以执行以下操作 module exports function schema options schema statics customFunction function criteria Code 这是我的架构 var
  • 在 MongoDB 查询中,负限制是什么意思?

    我正在使用 Mongoid ruby gem 与 MongoDB 进行交互 当我尝试从查询中获取某些内容时 它会添加 limit 1 即负数 当我希望它只使用1 我尝试在控制台中执行相同的操作 但它没有更改返回的文档 负数限制是否意味着什么
  • 使用 mongoimport 从 Windows 文件夹批量导入 MongoDB

    我的存档中有很多 json 文件 我需要将它们导入到 mongo 每一个操作中 我认为它可能是循环的 你对此有什么想法吗 如果您使用的是 Linux Unix shell 您可以尝试 for filename in do mongoimpo
  • 在 React 应用程序中简单连接到 mongodb

    我使用 create react app 创建了简单的反应应用程序 这个应用程序包含表单 验证和引导程序 没有什么花哨的东西能像魅力一样发挥作用 我还注册了 mongo 以获得免费集群 以便我可以发送一些数据 所以我有这个网址 mongod
  • mongodb从不同数据库中选择

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

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

    我有以下问题 假设我有以下模型对象 class Person String id String firstName String lastName Map
  • mongodb 和 pymongo 文档大小 16Mb 限制

    我正在使用 Windows 上的 showIncludes 标志和 nix 上的 H 标志来分析构建中的包含内容 我正在用 python 脚本解析这些信息 包含的每个文件都变成一个对象 列出其子文件 它包含的文件 和祖先 包含该文件的包含路
  • 在这种情况下如何填充 Mongoose?

    const userSchema new mongoose Schema email type String unique true password String notifications notifiId type Schema Ty
  • Mongoose - 查询从多个集合中获取数据

    我想要获取猫鼬的查询在 Node js 应用程序中 如下所述输出 user js comment js 和 post js 是我使用的模型文件 user js var mongoose require mongoose var Schema

随机推荐

  • 多个线程在同一全局内存位置写入相同的值

    这个问题与以下问题密切相关this one https stackoverflow com questions 8315931 does writing the same value to the same memory location
  • 在文本区域内建议/自动完成的 jQuery 插件 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一个 jQuery 插件可以在文本区域内建议 自动完成 我想要的是在文本区域中向用户提供建议的单
  • 现代 C 和 C++ 中是否已弃用 f(void)? [复制]

    这个问题在这里已经有答案了 我目前正在重构 整理 C 项目中使用的一些旧 C 代码 并经常看到以下函数 int f void 我倾向于写成 int f 是否有任何理由不在整个代码库中将 void 替换为 以提高一致性 或者两者之间是否存在我
  • 如何使用 cassandra-cli 更新 gc_grace_seconds?

    更新列族并更改其列族的命令是什么gc grace seconds价值利用cassandra cli 对于CQLSH alter table
  • 为反应式管道编写方面

    我正在为返回承诺的方法编写方面 考虑以下方法 public Mono
  • 更新现有的 JobDataMap

    我有一份已经安排好的 Quartz 工作 我想更新与之关联的 JobDataMap 如果我得到一个 JobDataMapJobDataMap jobDataMap scheduler getJobDetail getJobDataMap 那
  • 防止 window.open 聚焦

    我想使用 window open 在 Google Chrome 的新选项卡中打开页面 但我不希望该窗口在打开后获得焦点 而是留在后台 这可能吗 它只需要在 Google Chrome 上运行 它还可以使用 Google Chrome 扩展
  • Pandas:从多索引中的日期中选择

    假设我有 MultiIndex 系列 date foo 2006 01 01 1 12931926 310 3 11084049 460 5 10812205 359 7 9031510 239 9 5324054 903 2007 01
  • 使用 websockets 和 SocketIO 防止“心跳超时”

    我正在使用 NodeJS 和 SocketIO 作为我的 websocket 解决方案 它工作正常 但几分钟后 我的套接字服务器总是超时 并在控制台中显示以下消息 debug fired heartbeat timeout for clie
  • glReadPixels() 会消耗单个核心的所有CPU周期

    我有一个带有 OpenGL 窗口的 SDL2 应用程序 它表现良好 当它运行时 该应用程序与我的 60Hz 显示器同步 并且我看到该应用程序的 CPU 使用率为 12 到目前为止 一切都很好 但是 当我通过从深度缓冲区 绘制后 读取单个 深
  • 检查 list 是否包含任何其他列表

    我有一个这样的参数列表 public class parameter public string name get set public string paramtype get set public string source get s
  • 覆盖类路径中的默认 hadoop jar

    我已经看到了许多使用用户类路径作为 hadoop 的先例的方法的表现形式 通常情况下 如果 m r 作业需要特定版本的库 而 hadoop 恰好已经使用旧版本的库 例如 jackson 的 json 解析器或 commons http 等
  • 进行隧道事件的正确方法

    EDIT 我想我问了一些 XY 问题 我并不真正关心隧道事件的运行 我关心的是事件的发生从父窗口后面的代码引发由该窗口子级的控件拾取并做出反应 而无需明确告诉子级其父级是谁并手动订阅该事件 我试图在父控件中引发一个事件 并让子控件侦听该事件
  • 4点透视变换失败

    我一直在尝试进行 4 点透视变换 以便开始进行一些 OCR 操作 从下图开始我可以检测到车牌号 并将其裁剪出来 绿色框是边界框 红点是我想要正方形的矩形的角 这是变换的输出 乍一看 它似乎已经完成了由内而外的变换 将零件放在两侧而不是点之间
  • 如何使用 matplotlib 或 graphviz 在 networkx 中绘制多重图

    当我将多图 numpy 邻接矩阵传递给 networkx 时 使用 from numpy matrix 函数 然后尝试使用 matplotlib 绘制图形 它会忽略多条边 我怎样才能让它绘制多条边 Graphviz 在绘制平行边方面做得很好
  • 将附加 JPanel 添加到 JPanel

    伙计们 这是一个相当基本的问题 基本上我有这样的代码 public SuperPanel setLayout new BorderLayout add panel1 BorderLayout NORTH add panel2 BorderL
  • 文本小部件内的 Tkinter 检查按钮和滚动

    使用中找到的代码这个 stackoverflow 帖子 https stackoverflow com questions 5860675 variable size list of checkboxes in standard tkint
  • 是否可以刷新视图中的ViewBag值?

    我正在尝试做一个动态下拉列表 我从数据库中获取下拉列表的选项并将它们放入对象列表中 根据复选框值 我从列表中删除对象并将该列表设置为 ViewBag 值 public ActionResult ThematicManagement stri
  • 使用 >450K 实例训练 Dlib 对象检测

    dlib 是否能够使用大规模数据集来训练目标检测器 我有超过 450K 的面部图像来训练面部检测器 是否可以使用 Dlib 或者我需要转向另一个替代方案 您可以使用多少数据取决于您的计算机中有多少 RAM 因此 也许您可 以根据每个图像的大
  • Mongodb,$sum 有条件

    文件 name abc length 25 area 10 name abc length 5 聚合查询后的输出 count 2 summarizedLength 30 summarizedArea null id name abc The