MongoDB是由C++语言编写的一种面向文档的NoSQL数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。与传统的关系型数据库(如 MySQL 或 PostgreSQL)不同,MongoDB 存储数据的方式是以 BSON(类似于 JSON 的二进制格式)格式来存储文档,而不是使用表格和行。每个文档可以包含多个键值对,因此非常灵活,适合处理大规模的数据集。
MongoDB的基本概念
文档:MongoDB中的数据基本单位是文档,类似于JSON对象,可以包含各种数据类型,如数字、日期、字符串、数组和嵌入式文档等。
集合:集合是一组用途相同或类似的文档的集合,相当于传统关系型数据库中的表。但MongoDB中的集合不受严格模式的管制,其中的文档可根据需要采用稍微不同的结构。
MongoDB的作用
高效存储大规模数据:MongoDB 使用了非结构化的存储方式,可以处理比传统关系数据库更大的数据量。
高可扩展性:MongoDB 具有水平扩展的能力,即通过增加更多的机器来提高性能和容量。
灵活的数据结构:每个文档的结构可以不同,这让开发者可以根据需求灵活设计数据存储结构。
支持分布式存储:MongoDB 支持数据分片,能够在多个服务器上分布数据,从而提高查询性能和系统可用性。
强大的查询功能:MongoDB 提供了丰富的查询语法和聚合功能,支持复杂的数据检索和操作。
官方下载地址:https://www.mongodb.com/try/download/community
这里改一下自定义安装路径,其他不用动
服务是启动的,配置一下环境变量
查看一下版本
现在就可以使用navicat进行连接使用了
/*insertOne():用于向集合中插入单个文档。*/
db.collection.insertOne({name: "John", age: 30, email: "john@example.com"});/*find()方法查询*/
db.collection.find({name: "John"});
mongodb的使用
MongoDB的聚合操作提供了丰富的功能,允许用户对数据进行复杂的查询、过滤、分组、排序和其他转换操作。这些聚合操作主要分为三类:单一作用聚合、聚合管道和MapReduce(从MongoDB 5.0开始已被弃用,因此这里主要讨论前两类)。
先理解一些概念:
MongoDB中的文档相当于MySQL中的行,但文档是嵌套的键值对集合,可以包含多个层次的嵌套数据。
聚合管道(Aggregation Pipeline)
定义:由多个 阶段(Stage) 组成的链式操作,每个阶段是一个独立操作,如筛选( m a t c h )、分组( match)、分组( match)、分组(group)、排序($sort)等。
类比 MySQL:类似 SQL 中 SELECT + WHERE + GROUP BY + HAVING + ORDER BY 的组合,但更灵活。
聚合操作 vs 普通文档操作
特点
优点:语法简单,执行速度快。
缺点:功能单一,无法处理复杂逻辑(如多条件分组、嵌套计算)。
一、单一作用聚合
单一作用聚合是MongoDB提供的简化聚合操作,适用于单一目标的快速统计,无需复杂的数据处理流程。它们通常直接调用集合方法,执行简单计算(如计数、去重)。
二、聚合管道
聚合管道是一个数据聚合的框架,模型基于数据处理流水线的概念。文档进入多级管道,每个管道阶段对文档进行一系列运算,然后将结果文档输出给下一个阶段。聚合管道包含多个阶段操作符,常用的有:
$match:筛选文档,只返回满足条件的文档,类似于SQL中的WHERE子句。此阶段通常用于减少管道中的文档数量,以提高后续阶段的处理效率。
$project:修改输入文档的结构,主要用于包含、排除字段或添加计算字段。此阶段可以灵活控制输出文档的格式。
$group:根据指定的字段进行分组,并可以对分组后的文档执行聚合操作(如计数、求和等)。此阶段是聚合操作中的核心部分,用于对数据进行分组和统计。
$sort:对文档进行排序。此阶段可以对文档按照指定字段进行升序或降序排序。
$limit:限制返回的文档数量。此阶段用于控制输出结果的数量。
$unwind:将数组类型的字段拆分为多个文档。此阶段用于处理数组类型的字段,将每个数组元素拆分为一个独立的文档。
$lookup:进行左外连接,类似于SQL中的JOIN操作。此阶段用于将当前集合与其他集合进行关联查询,获取相关联的数据。
$out:将聚合结果输出到一个新集合。此阶段用于将聚合结果保存到指定的新集合中。
$replaceRoot:替换输入文档为指定的文档。此阶段通常用于改变文档的根结构。
$count:返回文档总数。此阶段用于统计满足条件的文档数量。
f a c e t :并行执行多条聚合管道,并将结果合并到一个单一的文档中。此阶段用于处理复杂的聚合需求,可以同时执行多个聚合操作并合并结果。此外,还有一些其他管道操作符如 facet:并行执行多条聚合管道,并将结果合并到一个单一的文档中。此阶段用于处理复杂的聚合需求,可以同时执行多个聚合操作并合并结果。 此外,还有一些其他管道操作符如 facet:并行执行多条聚合管道,并将结果合并到一个单一的文档中。此阶段用于处理复杂的聚合需求,可以同时执行多个聚合操作并合并结果。此外,还有一些其他管道操作符如bucket、 b u c k e t A u t o 、 bucketAuto、 bucketAuto、sortByCount等,用于对数据进行更高级的分组和排序操作。
aggregate 是 MongoDB 提供的 聚合管道的入口方法,用于执行多阶段的数据处理(如筛选、分组、排序、计算等)。
只有使用 aggregate 方法,才能使用 g r o u p 、 group、 group、sum、$avg 等聚合操作符(称为 聚合阶段操作符)。
示例:
// 插入示例数据
db.sales.insertMany([{_id: 1,product: "iPhone 15",category: "电子产品",price: 6999,quantity: 2,region: "华东",date: ISODate("2023-10-05")},{_id: 2,product: "羽绒服",category: "服装",price: 899,quantity: 5,region: "华北",date: ISODate("2023-10-12")},{_id: 3,product: "咖啡机",category: "家电",price: 1599,quantity: 1,region: "华南",date: ISODate("2023-11-02")},{_id: 4,product: "蓝牙耳机",category: "电子产品",price: 399,quantity: 10,region: "华东",date: ISODate("2023-11-15")}
]);
//筛选日期为 2023年10月 的订单,按 category 分组,计算每个类别的 总销售额(price × quantity),按总销售额降序排序。
db.sales.aggregate([// 阶段1:筛选日期范围{ $match: { date: { $gte: ISODate("2023-10-01"), $lt: ISODate("2023-11-01") }}},// 阶段2:计算每个订单的销售额(price * quantity){ $addFields: { totalSale: { $multiply: ["$price", "$quantity"] } }},// 阶段3:按category分组统计总销售额{ $group: { _id: "$category",totalSales: { $sum: "$totalSale" },avgSalePerOrder: { $avg: "$totalSale" },orderCount: { $sum: 1 } // 统计订单数量}},// 阶段4:按totalSales降序排序{ $sort: { totalSales: -1 } }
]);