数组内的多个嵌套组

2024-01-01

我在 MongoDB 中有一组元素,如下所示:

/* 1 */
{
    "_id" : ObjectId("58736c7f7d43c305461cdb9b"),
    "Name" : "Kevin",
    "pb_event" : [ 
        {
            "event_type" : "Birthday",
            "event_date" : "2014-08-31"
        }, 
        {
            "event_type" : "Anniversary",
            "event_date" : "2014-08-31"
        }
    ]
}

/* 2 */
{
    "_id" : ObjectId("58736cfc7d43c305461cdba8"),
    "Name" : "Peter",
    "pb_event" : [ 
        {
            "event_type" : "Birthday",
            "event_date" : "2014-08-31"
        }, 
        {
            "event_type" : "Anniversary",
            "event_date" : "2015-03-24"
        }
    ]
}

/* 3 */
{
    "_id" : ObjectId("58736cfc7d43c305461cdba9"),
    "Name" : "Pole",
    "pb_event" : [ 
        {
            "event_type" : "Birthday",
            "event_date" : "2015-03-24"
        }, 
        {
            "event_type" : "Work Anniversary",
            "event_date" : "2015-03-24"
        }
    ]
}

现在我想要有组的结果event_date然后在分组之后event_type. event_type包含相关用户的所有名称,然后是相应数组中的记录数。

预期输出

/* 1 */
{    
    "event_date" : "2014-08-31",
    "data" : [ 
        {
            "event_type" : "Birthday",
            "details" : [ 
                {
                    "_id" : ObjectId("58736c7f7d43c305461cdb9b"),
                    "name" : "Kevin"
                }, 
                {
                    "_id" : ObjectId("58736cfc7d43c305461cdba8"),
                    "name" : "Peter"
                }
            ],
            "count" : 2
        }, 
        {
            "event_type" : "Anniversary",
            "details" : [ 
                {
                    "_id" : ObjectId("58736c7f7d43c305461cdb9b"),
                    "name" : "Kevin"
                }
            ],
            "count" : 1
        }
    ]
}

/* 2 */
{
    "event_date" : "2015-03-24",
    "data" : [ 
        {
            "event_type" : "Anniversary",
            "details" : [ 
                {
                    "_id" : ObjectId("58736cfc7d43c305461cdba8"),
                    "name" : "Peter"
                }
            ],
            "count" : 1
        }, 
        {
            "event_type" : "Birthday",
            "details" : [ 
                {
                    "_id" : ObjectId("58736cfc7d43c305461cdba9"),
                    "name" : "Pole"
                }
            ],
            "count" : 1
        }, 
        {
            "event_type" : "Work Anniversary",
            "details" : [ 
                {
                    "_id" : ObjectId("58736cfc7d43c305461cdba9"),
                    "name" : "Pole"
                }
            ],
            "count" : 1
        }
    ]
}

使用聚合框架,您需要运行具有以下阶段的管道,以便获得所需的结果:

db.collection.aggregate([
    { "$unwind": "$pb_event" },
    {
        "$group": {
            "_id": {
                "event_date": "$pb_event.event_date",
                "event_type": "$pb_event.event_type" 
            },            
            "details": {
                "$push": {
                    "_id": "$_id",
                    "name": "$Name"
                }
            },
            "count": { "$sum": 1 }            
        }
    },    
    {
        "$group": {
            "_id": "$_id.event_date",            
            "data": {
                "$push": {
                    "event_type": "$_id.event_type",
                    "details": "$details",
                    "count": "$count"
                }
            }           
        }
    },
    {
        "$project": {
            "_id": 0,
            "event_date": "$_id",
            "data": 1
        }
    }
])

在上面的管道中,第一步是$unwind https://docs.mongodb.com/manual/reference/operator/aggregation/unwind/#pipe._S_unwind操作员

{ "$unwind": "$pb_event" }

当数据存储为数组时,这非常方便。当展开运算符应用于列表数据字段时,它将为应用展开的列表数据字段的每个元素生成一条新记录。它基本上使数据扁平化。

这是下一个管道阶段的必要操作,即$group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group通过解构对展平文档进行分组的步骤pb_event数组字段event_date and event_type:

{
    "$group": {
        "_id": {
            "event_date": "$pb_event.event_date",
            "event_type": "$pb_event.event_type" 
        },            
        "details": {
            "$push": {
                "_id": "$_id",
                "name": "$Name"
            }
        },
        "count": { "$sum": 1 }            
    }
},

The $group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group管道运算符类似于 SQL 的GROUP BY条款。在 SQL 中,您不能使用GROUP BY除非您使用任何聚合函数。同样,您也必须使用 MongoDB 中的聚合函数(称为累加器运算符)。您可以阅读有关聚合函数的更多信息here https://docs.mongodb.com/manual/reference/operator/aggregation/group/#accumulator-operator.

In this $group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group操作,计算计数聚合的逻辑,即使用以下方法计算组中文档的总数$sum https://docs.mongodb.com/manual/reference/operator/aggregation/sum/#grp._S_sum累加器运算符。在同一个管道中,您可以聚合一个列表name and _id子文档通过使用$push https://docs.mongodb.com/manual/reference/operator/aggregation/push/#grp._S_push运算符返回每个组的表达式值数组。

前面的$group https://docs.mongodb.org/manual/reference/operator/aggregation/group/#pipe._S_group管道

{
    "$group": {
        "_id": "$_id.event_date",            
        "data": {
            "$push": {
                "event_type": "$_id.event_type",
                "details": "$details",
                "count": "$count"
            }
        }           
    }
}

将通过分组进一步聚合最后一个管道的结果event_date,它通过使用创建新的数据列表来形成所需输出的基础$push https://docs.mongodb.com/manual/reference/operator/aggregation/push/#grp._S_push然后是决赛$project https://docs.mongodb.com/manual/reference/operator/aggregation/project/#pipe._S_project管道阶段

{
    "$project": {
        "_id": 0,
        "event_date": "$_id",
        "data": 1
    }
}

通过重命名来重塑文档字段_id字段到event_date并保留其他字段。

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

数组内的多个嵌套组 的相关文章

  • 查找聚合中的管道在 mongodb 中不起作用

    我是 mongodb 的新手 所以我希望这不会成为一个非常基本的问题 我做了一些研究 并试图应用我所发现的东西 但有些东西似乎让我忽略了 我有两个以下格式的集合 Shop shopId 1002 shopPosId 10002 descri
  • 在节点中使用mongoosejs更新多条记录

    我在使用 mongoosejs 和 Node js 更新多个记录时遇到问题 由于某种原因 即使有多个匹配 我也只更新一条记录 我还注意到回调在 update 之后不会触发 我没有收到任何错误消息 这里发生了什么 Page find stat
  • 猫鼬模式创建

    我刚刚开始使用猫鼬 我有一个使用 mongoose 的创建脚本 它使用示例数据创建模式和数据库 现在我编写实际的应用程序 我是否需要在每次应用程序运行时创建架构对象 或者它是否已经以某种方式可用 换句话说 我是否需要在每个使用 mongoo
  • Mongodb聚合,如何按间隔标准对文档进行计数?

    我的 MongoDB 文档如下所示 StatCode LoadTime 例如 数据可能如下所示 id StatCode LoadTime 1 200 0 345 2 200 0 234 3 200 0 396 4 200 1 234 5 2
  • 在 MongoDB 中按索引更新插入数组中子文档中的字段

    我有以下 MongoDB 结构 id other stuff my array title body email title body email title body email 我需要在 my array 字段内的子文档中更新 或插入
  • 在 MongoDB 中查找 7 天前的记录

    我有一个包含对象的集合 如下所示 1 id ObjectId 551c6605e4c6ac495c923aab sender id ObjectId 551c6605e4c6ac495c923aac rep sender id 38 sen
  • mongodb在windows下无法启动?

    当我尝试在命令行上使用命令 mongod exe 启动 mongodb 时 它会抛出以下错误 C mongodb win32 x86 64 2 0 6 bin gt mongod exe mongod exe help for help a
  • 聚合和展开数组,但保留顶级键

    假设我的收藏中有以下文档Classes收藏家 id ObjectId 5df58d45244a850d54b922c8 mentors numOfMentors NumberInt 1 mentorList ObjectId 5c9ba63
  • 如何更改 MongoDB 用户权限?

    例如 如果我有这个用户 gt db system users find user testAdmin pwd some hash roles clusterAdmin otherDBRoles TestDB readWrite 我想给那个用
  • Mongodb 限制聚合查询中的数组

    我正在尝试编写一个查询来返回每个类别中的前 X 个术语 例如前 5 个 前 10 个等 每个术语都有一个关联的类别 并且基于另一个术语的帮助堆栈溢出问题 https stackoverflow com questions 25666187
  • 如何在没有objectid字段的mongodb集合上查找上次更新/插入/删除操作时间

    我在 MongoDb 数据库中有一些未使用的集合 我必须找出对数据库中的集合执行 CRUD 操作的时间 我们有自己的 id字段 而不是mongo默认的object id 我们没有任何时间在集合中归档以找出修改时间 有没有办法从元数据中找出m
  • MongoDB,从数组中删除对象

    Doc id 5150a1199fac0e6910000002 name some name items id 23 name item name 23 id 24 name item name 24 有没有办法从数组中提取特定对象 IE
  • Mongodb 聚合数组中的子文档

    我正在使用 mongodb 作为后端实现一个小型应用程序 在此应用程序中 我有一个数据结构 其中文档将包含一个包含子文档数组的字段 我使用以下用例作为基础 http docs mongodb org manual use cases inv
  • 为 Meteor 数据创建编号列表

    有没有办法获取 Meteor 集合中项目的编号列表的 编号 我知道我可以在 html 中做到这一点 但我觉得如果我可以在 spacebars 中放置一些东西 那么样式会更容易 如果我可以使用更好的术语 请告诉我 像这样的东西 前 20 部电
  • Mongodb - 为现有集合添加架构

    我的 MongoDB 中有一个包含 1300 万条记录的集合 不幸的是 当我创建这个集合时 没有为其创建模式 我想知道除了备份整个数据库 创建架构并上传所有数据之外 是否有任何方法可以添加 JSON 架构 您可以使用以下方法将 JSON 架
  • 使用 Tweepy 获取推文时出错

    我有一个用于获取推文的 Python 脚本 在脚本中我使用该库 Tweepy 我使用有效的身份验证参数 运行此脚本后 一些推文存储在我的 MongoDB 中 有些则被 if 语句拒绝 但我仍然收到错误 requests packages u
  • 在 MongoDB 聚合的“addField”操作中使用“$count”

    我正在尝试找到聚合运算符的正确组合 以将标题为 totalCount 的字段添加到我的 mongoDB 视图中 这将为我提供聚合管道特定阶段的计数 并将其输出为每个文档的计数结果 count count 但最终我得到了一个具有此结果的文档
  • 如何处理 MongoDB 的断开连接错误

    我在 Node js 进程中看到了这个未捕获的异常 Uncaught exception Error read ETIMEDOUT at TCP onStreamRead internal stream base commons js 16
  • 使用 Mongoose 无法找到按 ObjectId 搜索的文档

    Campaign find client id req param client id error campaigns gt if error response error error message else for campaign i
  • 使用 MongoDB 和 Nodejs 插入和查询日期

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

随机推荐

  • Alamofire 使用 PUT 上传图像

    我目前正在尝试使用预先签名的网址将图像上传到亚马逊 它的工作方式是 我发出 GET 请求来获取预签名的 URL 然后发出 PUT 请求以使用 GET 请求返回的 url 上传图像 这两条规则是 Content Type 必须是 image
  • 用于压缩的 WCF 自定义绑定

    遵循样本压缩 http msdn microsoft com en us library ms751458 aspx由微软 我已将编码器 编码器工厂和绑定元素添加到我的解决方案中 与他们的示例的不同之处在于 我们不通过配置文件 要求 注册端
  • 将 MVC3 应用程序发布到 IIS 错误 - Web 服务器配置为不列出此目录的内容

    我将网站发布到 C inetpub wwwroot Sem App 并创建了一个物理路径为 C inetpub wwwroot Sem App 和端口 84 的网站 当我在http localhost 84 我收到以下错误 HTTP Err
  • 隐藏 MasterDetailPage 上的导航栏

    我有一个 MasterDetailPage 包含以下构造函数 public MainPage NavigationPage SetHasNavigationBar this false NavigationPage SetHasBackBu
  • Firebase - 在 Node.js 服务器上创建用户

    我们有一个使用 Firebase v2 的大型 SPA 我们想升级到新的 API 但遇到以下问题 由于应用程序相当大 我们开发了许多集成测试 对于这些测试 我们总是需要重置数据库并将其初始化为某些用户存在的状态 然而 我们发现确实不再有在服
  • 如何使用 python 和 openssl 验证 webhook 签名

    我正在尝试验证传入的 webhook 但到目前为止生成的哈希值与 api 生成的测试哈希值不匹配 文档列出了以下 Ruby 示例 但我使用的是 Python Django 因此任何 转换 此函数的帮助将不胜感激 红宝石函数 request
  • 路由“ActivityFeed”的组件必须是 React 组件

    我在这里查看了关于类似问题的各种类似帖子 但没有一个答案为我解决了这个问题 这是完整的错误 所以在我的src navigation feed stack js它的定义如下 import React from react import Sta
  • 通过 Button 向 Php 函数传递值

    我是 php 初学者 目前正在管理面板上工作 你可以看到我的管理面板页面 问题是我想通过这两个按钮传递序列号以进一步执行 但我找不到如何发送 value编辑和删除特定行 div strong h3 Admin page h3 strong
  • 检测当前页面是否加载AngularJS的方法

    如何检测当前页面是否加载了 AngularJS 我想从 CDN 加载 AngularJS 如果失败 我想从 LocalServer 加载 以下脚本针对 JQuery 执行此操作
  • Spring中ApplicationContext.xml和属性文件的位置

    在我的应用程序中 我放置了ApplicationContext xml文件放在 src 中 项目运行良好 我们可以放置ApplicationContext xml在我们的 WebContent 或 Web Inf 文件夹中 我还想知道是否可
  • 搜索具有不同列的多个表

    我想为我的网站建立一个搜索引擎 我的数据库表列表如下 d name 我需要搜索two列 em 我需要搜索one column seri 我需要搜索one column topics 我需要搜索one column 许多其他表的数量是动态的
  • 行在 Android 布局中无法正确呈现。按钮似乎是问题

    我是 Android 开发新手 我的 XML 布局遇到了问题 当我只有包含文本和 edittext 的行时 布局保持正常 但是一旦我将带有按钮的行放在下面 下面的行就会消失在屏幕下方 这些行彼此渲染得很远 我做错了什么 我的应用程序的 iP
  • java CompletableFuture 相当于 scala Future 的救援和句柄是什么

    我看到CompletableFuture有一个方法handle与 scala 相同Future s handle基本上将成功和异常全部转换为成功map and flatMap上游 或thenApply and thenCompose在Jav
  • Go:同一包中未定义的函数[重复]

    这个问题在这里已经有答案了 我已经开始 Go 并试图遵循这个tutorial https www activestate com blog 2017 04 creating web app using golang gorilla web
  • 摆脱 Scala Future 嵌套

    当一个函数依赖于一些未来的结果时 我一次又一次地陷入困境 这通常可以归结为像 Future Seq Future MyObject 这样的结果 为了摆脱这个问题 我现在在辅助函数中使用 Await 来获取非未来对象并减少嵌套 看起来像这样
  • NPOI 格式错误

    我正在开发一个会计软件 它还将创建 Excel 格式的报告 xls 我几乎在每个需要 Excel 报告的项目中都使用过 NPOI 没有出现任何重大问题 但我现在面临一个问题 似乎无法通过浏览互联网找到任何解决方案 正如您所看到的 在报表中途
  • 什么是 PL-Unit 中的“选择点测试成功”警告,如何修复它?

    我正在编写一个序言程序检查变量是否为整数 我 返回 结果的方式很奇怪 但我认为这对于回答我的问题并不重要 测试 我写过passing针对此行为的单元测试 他们来了 foo test pl begin tests foo consult fo
  • 获取数组内数组的总和[重复]

    这个问题在这里已经有答案了 我如何获得sum这个数组的 arrays 0 176000 0 500 0 3960000 The output应该 arrays 0 4136500 任何帮助都感激不尽 使用可变参数和null第一个回调arra
  • 自定义 REST 协议基于二进制而不是像 Http 这样基于文本是一件好事吗?

    您是否曾经见过创建自定义二进制休息协议而不是使用基本的 http 休息实现的充分理由 我目前正在 Net 中开发面向服务的架构框架 负责托管和使用服务 我不想基于像 Remoting 或 WCF 这样的现有框架 因为我想要完全的灵活性和控制
  • 数组内的多个嵌套组

    我在 MongoDB 中有一组元素 如下所示 1 id ObjectId 58736c7f7d43c305461cdb9b Name Kevin pb event event type Birthday event date 2014 08