MongoDB 聚合查询详解

MongoDB 聚合查询详解

MongoDB 是一个面向文档的 NoSQL 数据库,提供了丰富的聚合查询操作。聚合查询可以帮助我们分析和处理数据,如求和、求平均值、分组等操作。本文将详细介绍 MongoDB 聚合查询的语法和使用方法,并提供了两个实例进行说明。

MongoDB 聚合查询语法

聚合查询使用聚合管道(pipe)的方式对文档进行操作。聚合管道由一系列各种聚合阶段(stage)组成。每个聚合阶段包含一个操作符(operator)和其相应的参数。聚合阶段按照定义的顺序依次执行,并将输出作为下一阶段的输入。下面是 MongoDB 聚合查询的语法模板:

db.collection.aggregate([
  { $match: { /* 查询条件 */ } },
  { $project: { /* 投影字段 */ } },
  { $group: { /* 分组字段 */ } },
  { $sort: { /* 排序字段 */ } },
  { $limit: /* 限制数量 */ },
  { $skip: /* 跳过数量 */ },
  { $unwind: { /* 展开嵌套字段 */ } },
  // ...
]);

上述语法模板中,各聚合阶段的作用如下:

  • $match 阶段:用于筛选符合条件的文档,相当于 find 方法的查询条件。
  • $project 阶段:用于选择需要输出的字段,相当于 SQL 中的 SELECT 语句。
  • $group 阶段:用于按照指定字段分组,并进行聚合操作,如求和、计数、取最大值等。
  • $sort 阶段:用于排序,可以按照指定字段升降序排列。
  • $limit 阶段:用于限制输出的文档数量。
  • $skip 阶段:用于跳过指定数量的文档。
  • $unwind 阶段:用于展开嵌套的数组字段。

除上述聚合阶段外,MongoDB 还提供了丰富的聚合操作符,用于实现各种聚合操作。

MongoDB 聚合查询示例

示例 1:统计成绩

假设我们有一个学生成绩的集合,包含如下的文档:

db.scores.insertMany([
  { name: '张三', subject: '语文', score: 80 },
  { name: '张三', subject: '数学', score: 90 },
  { name: '李四', subject: '语文', score: 85 },
  { name: '李四', subject: '数学', score: 95 },
  { name: '王五', subject: '语文', score: 90 },
  { name: '王五', subject: '数学', score: 80 },
]);

我们需要统计每个学生各科目的总分和平均分,并按照总分从高到低排序。可以使用如下的聚合查询:

db.scores.aggregate([
  { $group: { _id: { name: '$name', subject: '$subject' }, total: { $sum: '$score' } } },
  { $group: { _id: '$_id.name', subjects: { $push: { name: '$_id.subject', total: '$total' } }, total: { $sum: '$total' }, avg: { $avg: '$total' } } },
  { $sort: { total: -1 } },
  { $project: { _id: 0, name: '$_id', total: 1, avg: 1, subjects: { $arrayToObject: { $map: { input: '$subjects', as: 's', in: { k: '$$s.name', v: '$$s.total' } } } } } },
]);

上述聚合查询的含义如下:

  • 第一阶段使用 $group 操作符按照 namesubject 分组,统计每个学生每门课程的总分。
  • 第二阶段使用 $group 操作符按照 name 分组,将每个学生各科目的总分整合到一个数组中,并统计每个学生的总分和平均分。
  • 第三阶段使用 $sort 操作符按照 total 从高到低排序。
  • 第四阶段使用 $project 操作符选择输出的字段,并使用 $arrayToObject 操作符将科目成绩的数组转换为对象格式。

执行上述聚合查询后,输出结果如下:

[
  {
    "name": "李四",
    "total": 180,
    "avg": 90,
    "subjects": {
      "语文": 85,
      "数学": 95
    }
  },
  {
    "name": "张三",
    "total": 170,
    "avg": 85,
    "subjects": {
      "语文": 80,
      "数学": 90
    }
  },
  {
    "name": "王五",
    "total": 170,
    "avg": 85,
    "subjects": {
      "语文": 90,
      "数学": 80
    }
  }
]

示例 2:多表聚合

假设我们有一个用户和订单的数据,其中用户信息储存在 users 集合中,订单信息储存在 orders 集合中,并使用 userid 字段关联两个集合。我们需要统计每个用户的订单数量、总金额以及平均金额。可以使用如下的聚合查询:

db.users.aggregate([
  { $lookup: { from: 'orders', localField: '_id', foreignField: 'userid', as: 'orders' } },
  { $unwind: '$orders' },
  { $group: { _id: '$_id', total: { $sum: '$orders.amount' }, count: { $sum: 1 } } },
  { $project: { _id: 0, name: '$username', total: 1, count: 1, avg: { $divide: ['$total', '$count'] } } },
]);

上述聚合查询的含义如下:

  • 第一阶段使用 $lookup 操作符关联 orders 集合,并将结果保存到 orders 字段中。
  • 第二阶段使用 $unwind 操作符展开 orders 数组。
  • 第三阶段使用 $group 操作符按照 userid 统计每个用户的订单总金额和数量。
  • 第四阶段使用 $project 操作符选择输出的字段,并使用 $divide 操作符计算平均金额。

执行上述聚合查询后,输出结果如下:

[
  { "name" : "张三", "total" : 80, "count" : 1, "avg" : 80 },
  { "name" : "李四", "total" : 200, "count" : 2, "avg" : 100 },
  { "name" : "王五", "total" : 60, "count" : 1, "avg" : 60 },
]

以上就是 MongoDB 聚合查询的详细介绍和两个实例的说明。聚合查询是 MongoDB 强大的功能之一,掌握了聚合查询,我们可以更加高效地进行数据处理和分析。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:MongoDB 聚合查询详解 - Python技术站

(1)
上一篇 2023年5月16日
下一篇 2023年5月16日

相关文章

  • MongoDB中对文档的增删查改基本操作方法总结

    针对“MongoDB中对文档的增删查改基本操作方法总结”的完整攻略,我将分别对这四个操作进行详细讲解,并提供两个示例说明。具体内容如下: MongoDB文档的增删查改基本操作 1. 文档的增加 1) 使用insertOne方法插入单个文档 通过db.collection.insertOne()方法可以向指定集合中添加单个文档。语法格式如下: db.colle…

    MongoDB 2023年5月16日
    00
  • 精选30道Java笔试题解答(附答案)

    下面是针对“精选30道Java笔试题解答(附答案)”的完整攻略。 1. 了解题目类型 在开始解题前,需要先梳理一下这些题目的类型。Java笔试题大多数是基础知识的考察,需要熟悉Java的数据类型、循环、条件语句、面向对象等基本概念。另外,也会涉及到一些算法和数据结构的知识。具体来说,这些题目的类型包括但不限于以下几种: 选择题 填空题 编程题 在了解题目类型…

    MongoDB 2023年5月16日
    00
  • Python操作mongodb的9个步骤

    下面我将详细讲解Python操作mongodb的9个步骤的完整攻略。整个过程中包含两条示例说明。 1. 安装pymongo 在Python中,使用PyMongo库来操作MongoDB。安装方式如下: pip install pymongo 2. 导入pymongo库 安装好后,在Python中使用Pymongo的方法是先导入Pymongo库。 import …

    MongoDB 2023年5月16日
    00
  • MongoDB中4种日志的详细介绍

    MongoDB是一种非关系型数据库,主要通过一个稳定的日志系统来保证数据的完整性和可靠性。MongoDB中包含4种类型的日志,分别是:操作日志、慢查询日志、系统事件日志和修复日志。 操作日志 操作日志主要记录了MongoDB中执行的所有操作,如插入、更新、删除等。操作日志的作用是记录所有对数据库的修改,以便于后续对数据做出追踪与监控。 操作日志的开启需要设置…

    MongoDB 2023年5月16日
    00
  • Java中PageHelper分页后对list操作导致分页无效

    Java中PageHelper是一个非常常用的分页插件,在使用过程中我们常会遇见“PageHelper分页后对list操作导致分页无效”的问题,本文将详细讲解解决这一问题的完整攻略。 问题描述 在使用PageHelper对List进行分页时,很多开发者会直接对分页后的List进行操作或者对原List进行操作,这种操作会导致原有的分页无效,所有的数据都显示出来…

    MongoDB 2023年5月16日
    00
  • mongodb中使用distinct去重的简单方法

    为了使用distinct方法,需要执行以下步骤: 第一步:连接MongoDB数据库 首先需要连接MongoDB数据库,启动MongoDB客户端并输入以下命令: mongo 该命令将连接到默认的localhost:27017端口。如果你需要连接到其他端口或者IP地址,可以使用以下命令: mongo –host <hostname>:<por…

    MongoDB 2023年5月16日
    00
  • js读取并解析JSON类型数据的方法

    下面是”JS读取并解析JSON类型数据的方法”的完整攻略: 什么是JSON格式数据? JSON(JavaScript Object Notation)是一种常用的数据交换格式,它基于JavaScript语法而创建。JSON格式的数据通常用于前后端之间的数据传输。 JSON数据的最外层是一个大括号{},里面存放一系列键值对,键和值之间用冒号:分隔,键值对之间用…

    MongoDB 2023年5月16日
    00
  • mongoDB实现分页的方法

    下面是详细的MongoDB实现分页的方法。 概述 MongoDB是一种NoSQL数据库,具有分布式、可扩展和高性能的特点。它使用BSON(二进制JSON)格式存储数据,支持各种查询操作,还提供了用于分页的skip()和limit()方法。 分页方法 MongoDB中实现分页的方法是使用skip()和limit()方法,其中:- skip()方法用于跳过指定数…

    MongoDB 2023年5月16日
    00
合作推广
合作推广
分享本页
返回顶部