整理mongodb文档:聚合管道

这篇具有很好参考价值的文章主要介绍了整理mongodb文档:聚合管道。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人博客

整理mongodb文档:聚合管道

个人博客,求关注,电脑版看体验更加,如果不够清晰,请指出来,谢谢

文章概叙

文章主要通过几个常用的聚合表达式来介绍聚合管道的使用,以及从索引的角度来介绍聚合管道的限制,让大家对聚合管道有一个理解。

聚合管道

聚合操作处理数据记录和 return 计算结果。聚合操作将来自多个文档的值组合在一起,并且可以对分组数据执行各种操作以返回单个结果。
如果说,索引能帮我们解决查得慢的问题,那么聚合就能帮我们解决查得复杂的问题。使用聚合管道,就是为了解决复杂的sql的问题,尤其是涉及到多个表的、复杂的查询。

聚合表达式

聚合表达式是我们整个聚合管道学习的核心,其中使用的aggregate方法,就是我们用来做聚合操作的工具。

aggregate的使用方式如下:

db.test.aggregate()

接下来举一个博客网站留评论的例子,给大家讲解下几个常用的表达式,看完例子,对于aggragate也能熟悉。

假设有如下两张表,article表示文章,comment表示评论。
在article表中,存储着代表一篇博客的信息,内容如下:

整理mongodb文档:聚合管道,mongodb,数据库

在代表文章的article表中,我们用"article_id"作为文章的唯一标识,不使用默认的"_id"。其中的"can_comment"字段表示该博客是否允许评论。
现在的业务逻辑如下:当我们后台接收到前端的新增评论的请求时,我们需要在comment表中新增一条评论。

正常的情况下,我们会去用find方法去article表中查询是否有满足可以评论的数据,再用insertOne去comment表中新增一条记录,整体看下来至少需要两个sql。但使用聚合管道则只需要一个sql就可以做到同样的事情。所以遇到相似的业务的时候,基本都会选择使用aggregate来完成我们的业务。

接下来,使用aggregate来实现我们上述两步的逻辑。

使用"$match"从article表中查看是否有符合条件的记录。

过滤文档流以仅允许匹配的文档未经修改地传递到下一个管道阶段。 $match使用标准的 MongoDB
查询。对于每个输入文档,输出一个文档(匹配)或零文档(不匹配)。

db
    .article
    .aggregate([
        {
            "$match": {
                "can_comment": true,
                "article_id":'1'
            }
        }
    ])

返回结果如下,筛选出了我们选中的记录
整理mongodb文档:聚合管道,mongodb,数据库

2.在第一步中我们得到了一个数组对象,但是我们只需要一个文章的id,此时可以使用"$project"对字段进行保留跟丢弃,下方的例子,就直接保留article_id以及删除

重新整形流中的每个文档,例如添加新字段或删除现有字段。对于每个输入文档,输出一个文档。 有关删除现有字段,请参见$unset。

db
    .article
    .aggregate([
        {
            "$match": {
                "can_comment": true,
                "article_id": '1'
            }
        },
        {
            "$project": {
                "article_id": 1,
                "_id": 0
            }
        }
    ])

整理mongodb文档:聚合管道,mongodb,数据库

​3.我们需要将整理出来的数据放到comment表中,但是我们需要用"$addFields"来增加评论内容的字段

向文档添加新字段。类似于 p r o j e c t , project, projectaddFields重塑了流中的每个文档;具体而言,通过向输出文档添加新字段,该文档包含输入文档和新添加字段中的现有字段。
s e t 是 set是 setaddFields的别名。

添加了comment之后的sql如下:

db
    .article
    .aggregate([
        {
            "$match": {
                "can_comment": true,
                "article_id": '1'
            }
        },
        {
            "$project": {
                "article_id": 1,
                "_id": 0
            }
        },
        {
            "$set": {
                "comment": "文章的评论",
                "commentator": 'mk',
                "comment_time":"2023-08-22 18:00:00"
            }
        }])

整理mongodb文档:聚合管道,mongodb,数据库

此时,数据整理完毕,我们需要用到"$merge"方法将其写入到comment表中了

将聚合管道的结果文档写入集合。这个阶段可以将结果合并到一个输出集合中(插入新文档、合并文档、替换文档、保留现有文档、操作失败、使用自定义更新管道处理文档)。要使用$merge阶段,它必须是管道中的最后一个阶段。version 4.2 中的新功能

db
    .article
    .aggregate([
        {
            "$match": {
                "can_comment": true,
                "article_id": '1'
            }
        },
        {
            "$project": {
                "article_id": 1,
                "_id": 0
            }
        },
        {
            "$set": {
                "comment": "文章的评论",
                "commentator": 'mk',
                "comment_time": "2023-08-22 18:00:00"
            }
        }, {
            "$merge": {
                "into": 'comment'
            }
        }])

整理mongodb文档:聚合管道,mongodb,数据库

当然,上述的代码是建立在自己article表中有该条数据的情况下,接下来贴一张在article表中查询没有数据时候的运行结果​

整理mongodb文档:聚合管道,mongodb,数据库

可以看到,由于在article表中查不到数据,所以后续的操作都被取消​了。

聚合管道限制

聚合管道能满足我们许多复杂的需求,能让我们在db层就将我们的数据整理好,而不是通过一个又一个find方法去查询索引能帮我们快速的查询。而聚合能帮我们做复杂的数据。因此我们需要处理好索引跟聚合管道的关系,防止顾此失彼。

举一个例子,在一个集合中,使用"$facet"起一个别名作为数据

在同一组输入文档的单个阶段内处理多个聚合管道。允许创建能够在单个阶段中跨多个维度或方面描述数据的多面聚合。

db
    .article
    .aggregate([
        {
            "$facet": {
                "article_list": [{
                    "$match": {
                        "can_comment": true
                    }
                }]}
        }])

该例子直接去article表中查询能够评论的文章,然后将其赋名为article_list。​结果如下:

整理mongodb文档:聚合管道,mongodb,数据库

此时,我们使用explain查看查询的​状态,看看是否使用到了索引。

db
    .article
    .aggregate([
        {
            "$facet": {
                "article_list": [{
                    "$match": {
                        "can_comment": true
                    }
                }]}
        }]).explain("executionStats")

整理mongodb文档:聚合管道,mongodb,数据库

但是如果直接使用"$match"呢?

db
    .article
    .aggregate([{
        "$match": {
            "can_comment": true
        }
    }
    ]).explain()

整理mongodb文档:聚合管道,mongodb,数据库

可以看到,当我们使用"$facet"在最外围的时候,是不使用index查询的,就会导致很慢,而我们直接使用"$match"的时候,使用索引就会让查询时间大大的优化。
其他例子还有很多,这儿只是举个例子,如果出现了查询缓慢的情况,我建议使用explain看下运行结果。​

allowDiskUse

必须要提一嘴的是关于16mb的内存,前面提及到了aggregate会将数据整理完返回给我们的后台,但是很多时候会报错,显示内存超过16MB,这是可以设置allowDiskUse为true。当前的代码是在shell中使用,​建议大家自己去官网下查看。​

单用途聚合操作

单用途聚合操作顾名思义,指的是用途单一的聚合管道,主要包括下面三种计数的方法,但是了解了之后会发现基本都是用来统计数量的,现在列举如下

1.estimatedDocumentCount

统计文档总数,返回集合或视图中所有文档的计数。该方法包装count命令。

db.test.estimatedDocumentCount()

2.count
也是一种计数的方式,但是可以添加条件,使用方法如下

db.test.count()
db.test.count({string:'a'})

3.distinct

查询不同值,并返回一个数组,包含所有的结果

db.test.distinct('string')

整理mongodb文档:聚合管道,mongodb,数据库

最后的话

本文章不会详细介绍每一个表达式的优缺点,只会告诉大家要注意的点,最常用的表达式会后面再写​。毕竟框架搭建好了,添砖加瓦的事情可以慢慢来,aggregate的难度不大,就跟积木一样,不断的组装,完成我们的需求​文章来源地址https://www.toymoban.com/news/detail-669137.html

到了这里,关于整理mongodb文档:聚合管道的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • MongoDB-数据库文档操作(2)

    任务描述 文档数据在 MongoDB 中的查询和删除。 相关知识 本文将教你掌握: 查询文档命令; 删除文档命令。 查询文档 我们先插入文档到集合 stu1 : 然后查看 stu1 ,命令和结果如图1所示(因为我们没有设置 _id ,所以 MongoDB 会默认生成: 图 1 上述显示的文档格式不够整齐,

    2024年01月18日
    浏览(30)
  • 【数据库】通过实例讲清楚,Mongodb的增删查改,分组查询,聚合查询aggregate

    目录 一.基础概念 二.数据库的管理 1.创建数据库 2.删除数据库 二.集合的管理 1.显示所有集合 2.创建集合 3.删除当前集合 4.向集合中插入元素 三.文档的管理 1.文档插入 2.文档的更新 3.文档的删除 4.文档查询 (1)查询基本语法: (2)查询table2集合下的所有文档 (3)查询t

    2024年02月10日
    浏览(35)
  • 【文档数据库】ES和MongoDB的对比

    目录 1.由文档存储牵出的问题 2.什么是MongoDB? 3.ES和MongoDB的对比 本文或者说关于mongodb的这个系列文章的源头: 前面我们聊过了分布式链路追踪系统,在基于日志实现的分布式链路追踪的方式seluth+zipkin中为了防止数据丢失,需要将数据持久化。我们给出的是持久化进mysql中的

    2024年01月19日
    浏览(39)
  • 【MongoDB】数据库、集合、文档常用CRUD命令

    目录 一、数据库操作 1、创建数据库操作 2、查看当前有哪些数据库 3、查看当前在使用哪个数据库 4、删除数据库 二、集合操作 1、查看有哪些集合 2、删除集合 3、创建集合 三、文档基本操作 1、插入数据 2、查询数据 3、删除数据 4、修改数据 四、文档分页查询 五、文档其

    2024年02月13日
    浏览(36)
  • 通过Studio 3T对Mongodb进行 创建数据库/集合 增删查改集合文档操作

    首先 你需要安装Studio 3T 以及启动 Mongodb服务 具体可以参考我的文章 Studio 3T客户端连接Mongodb数据库服务 我们之前 通过 随便输切换是可以的 但除了这里能看到的 它们都仅存在于内存 我们右键顶部菜单 选择 添加数据库/创建数据库 这里 我们输入数据库名称 然后 点击OK 这样

    2024年02月01日
    浏览(40)
  • H2数据库配置及相关使用方式一站式介绍(极为详细并整理官方文档)

    注意:可以直接移步至【2. H2数据库实战】目录下进行对H2数据库的快速使用 1.1 H2数据库介绍 官方文档地址: http://www.h2database.com/html/main.html H2的开发始于2004年5月, 但它在2005年12月14日首次发表。 H2的原作者Thomas Mueller也是Hypersonic SQL的原始开发者。 2001年,他加入PointBase公司

    2024年02月13日
    浏览(31)
  • 整理mongodb文档:find方法查询数据

    整理mongodb文档:find方法查询数据 求关注,求批评,求指出,如果哪儿不清晰,请指出来,谢谢 如题,本文讲的是如何用find查询数据,如何在数组、字段、对象中查询,以及‘或’等查询操作,最后讲了一些参数。依旧是在shell下操作。 查询数据是db操作中很重要的一步,而

    2024年02月13日
    浏览(26)
  • MongoDB 聚合管道中使用字符串表达式运算符

    字符串表达式运算符主要用于实现字符串操作,主要包括了大小写转换、字符串截取、拼接、替换等 初始化字符串数据 语法:         去除开始位置的字符串:{ $ltrim: { input: string,  chars: string } }         去除结束位置的字符串:{ $rtrim: { input: string,  chars: string } }  

    2023年04月26日
    浏览(26)
  • Mongodb 多文档聚合操作处理方法(单一聚合)

    聚合操作处理多个文档并返回计算结果。您可以使用聚合操作来: 将多个文档中的值分组在一起。 对分组数据执行操作以返回单个结果。 分析数据随时间的变化。 要执行聚合操作,您可以使用: 聚合管道 单一目的聚合方法 Map-reduce 函数 所有这些操作都会聚合来自单个集合

    2024年02月16日
    浏览(33)
  • MySQL数据库:数据库的约束以及数据的聚合、联合查询

    目录 一.关系模型的简要概述 二.数据库的约束  2.1约束类型         2.2NULL约束 2.3 UNIQUE:唯一约束 2.4 默认约束 2.5 PRIMARY KEY:主键约束 2.6 FOREIGN KEY:外键约束 2.7 CHECK约束 三.高效率查询 3.1高效率查询的分类 3.2聚合查询 3.2.1聚合函数 3.2.2 GROUP BY子句 3.2.3HAVING 3.3.联合查询

    2024年02月10日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包