数组内的多个嵌套组

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的ObjectId是如何生成的?

    他们是吗somewhat随机的 我的意思是 人们能够将它们分开吗 它们不是随机的 可以很容易地预测 BSON ObjectID 是一个 12 字节值 由 4 字节时间戳组成 自纪元以来的秒数 一个 3 字节 机器 ID 2 字节进程 ID
  • Mongod 服务启动退出,代码为 100

    Problem 我的 mongo 服务不再启动 root machine service mongod start root machine service mongod status mongod service High perform
  • 环回关系不填充对象 ID 数组

    到目前为止我有 2 个模型 工作流程核心 工作流程步骤 工作流核心有一个steps属性 该属性是数组类型并且包含1 多个步骤 当呼叫接通时工作流程核心响应正文不会使用实际步骤对象填充步骤数组 工作流程核心 json name workflo
  • 如何修复 MongoClient is not a constructor 错误

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

    我正在为 MongoDB 数据库程序编写 REST 接口 并尝试实现搜索功能 我想公开整个 MongoDB 接口 我确实有两个问题 但它们是相关的 所以我将它们放在一篇文章中 使用 Python json 模块解码不受信任的 JSON 是否
  • 将 Django +1.10 与 MongoDB 连接

    在过去的几个月里 有人为 MongoDB 更换了 Django 1 10 中的默认数据库引擎吗 我在谷歌上得到的所有信息都是六四年前的 最常见的结果包括mongodb 引擎这需要Django nonrel 来自 Django 1 5 的一个
  • MongoDB insertMany 并跳过重复项

    我试图insertMany https docs mongodb com manual reference method db collection insertMany 项目进入我的 Mongo 数据库 但我想跳过重复的 ID 我在用着N
  • MongoDB 嵌套数组查询

    我问这个作为评论another https stackoverflow com questions 5250652 query a nested array in mongodb问题 还发了一个question https groups g
  • 为什么 Mongohint 可以使查询运行速度提高 10 倍?

    如果我使用explain 从shell运行mongo查询 获取所使用的索引的名称 然后再次运行相同的查询 但使用hint 指定要使用的相同索引 解释计划中的 millis 字段是显着下降 例如 没有提供任何提示 gt gt db event
  • MongoDB:仅获取过去 24 小时内创建的文档?

    我想限制我所做的查询仅查看过去 24 小时内创建的文档 构造此查询的最佳方式是什么 如何根据日期进行限制 Add createdAt字段 索引它 然后查询 db getCollection COLLECTION NAME find crea
  • 国外收藏的查找和排序

    所以我有一个收藏users 并且此集合中的每个文档以及其他属性都有另一个集合中文档的 id 数组 workouts 集合中的每个文档workouts有一个名为date 这就是我想要得到的 对于特定用户 我想要获取属于该用户的锻炼的 work
  • MongoDB Java 驱动程序:MongoCore 驱动程序与 MongoDB 驱动程序与 MongoDB 异步驱动程序

    MongoDB Java 驱动程序有三种不同的驱动程序选项 核心驱动 MongoDB 驱动程序 MongoDB 异步驱动程序 The 驱动程序描述页面 https docs mongodb org ecosystem drivers jav
  • 使用 python 字典更新 MongoEngine 文档?

    是否可以使用 python 字典更新 MongoEngine 文档 例如 class Pets EmbeddedDocument name StringField class Person Document name StringField
  • 如何同时使用 $gt 和 $lte 优化 MongoDB 查询?

    我有以下查询 有点像反向范围查找 db ip ranges find and start ip num lte 1204135028 end ip num gt 1204135028 当仅使用 lte 标识符运行时 查询会立即返回 但是当我
  • PyMongo 中的 MapReduce

    我的蒙戈收藏 Impressions具有以下格式的文档 uid 10 impressions pos 6 id 123 service furniture pos 0 id 128 service electronics pos
  • 如何在 Mongoose.js 查询中执行大于语法

    如何获得适用于此 Mongoose 查询的 大于 语法 var where where id req wine id where sameAs undefined where scoreTotal gt 0 THIS NEEDS TO SE
  • Mongoose:保存时根据父字段值设置子文档字段值

    这几乎肯定在其他地方有所涉及 但是 如果我有一个带有嵌入子文档的单一架构 如下所示 var ChildSchema new Schema name type String trim true user type String trim tr
  • 如何从 MongoDB 中的 ChangeStream 过滤对特定字段的更新

    我正在设置一个 ChangeStream 以便在集合中的文档发生更改时通知我 以便我可以将该文档的 LastModified 元素更新插入到事件发生的时间 由于此更新将导致 ChangeStream 上发生新事件 因此我需要过滤掉这些更新以
  • 更快地识别对象嵌套数组中具有重复字段的文档的方法

    我正在搜索更快的选项来将文档与嵌套数组内的字段中的重复值进行匹配 示例文档匹配条件 key 2 a p id 2 id 3 id 3 我需要找到更快的方法来仅匹配具有重复 a p id 值的文档 在带有 key 2 的示例文档中具有重复的
  • 本地 SQLite 与远程 MongoDB

    我正在设计一个新的 Web 项目 在研究了一些旨在可扩展性的选项后 我提出了两个数据库解决方案 为可扩展方式精心设计的本地 SQLite 文件 每个 X 用户一个新的数据库文件 因为写入将取决于用户内容 不存在跨用户数据依赖性 远程 Mon

随机推荐

  • 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