虽然MongoDB这些年很流行,但笔者之前没研究过,现在有需求研究这类NoSQL的数据库,是为了验证其是否可被替换。



MongoDB是很轻量的文档数据库,简单测试也懒得专门准备虚拟机环境了,直接在macOS上安装测试下其基础功能。

  • 1.使用 Homebrew 安装 MongoDB
  • 2.启动/停止 MongoDB 服务
  • 3.启动 MongoDB Shell
  • 4.体验 MongoDB 基本操作
  • 5.体验 MongoDB 聚合操作

1. 使用 Homebrew 安装 MongoDB

  1. # 添加 MongoDB 存储库
  2. brew tap mongodb/brew
  3. # 安装 MongoDB 社区版
  4. brew install mongodb-community

2. 启动/停止 MongoDB 服务

  1. # 启动 MongoDB 服务
  2. brew services start mongodb/brew/mongodb-community
  3. # 停止 MongoDB 服务(这个当然要等我们体验测试完成后才停..)
  4. brew services stop mongodb/brew/mongodb-community

3. 启动 MongoDB Shell

  1. # 打开 MongoDB 的交互式 Shell
  2. mongosh

在mongosh登录到MongoDB时可以看到,笔者这里安装的是7.0.12版本的MongoDB,使用默认端口27017:

  1. jingyuzhao@jingyuzhao-mac ~ % mongosh
  2. Current Mongosh Log ID: 668ce3d3012a1d349d3a46b3
  3. Connecting to: mongodb://127.0.0.1:27017/?directConnection=true&serverSelectionTimeoutMS=2000&appName=mongosh+2.2.10
  4. Using MongoDB: 7.0.12
  5. Using Mongosh: 2.2.10
  6. For mongosh info see: https://docs.mongodb.com/mongodb-shell/
  7. ------
  8. The server generated these startup warnings when booting
  9. 2024-07-09T15:09:54.021+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
  10. ------
  11. test>

4. 体验MongoDB基本操作

下面进行一些基本的 MongoDB 操作示例:

1)创建数据库和集合:

  1. -- 切换到要使用的数据库(如果不存在则会自动创建)
  2. use mydb
  3. -- 创建集合
  4. db.createCollection("myCollection")

2)插入文档:

  1. -- 插入单个文档:
  2. db.myCollection.insertOne({ name: "Alfred", age: 34 })
  3. -- 插入多个文档:
  4. db.myCollection.insertMany([
  5. { name: "Mcdull", age: 33 },
  6. { name: "Sally", age: 4 }
  7. ])

3)查询文档:

  1. -- 查询所有文档:
  2. db.myCollection.find()
  3. -- 查询满足条件的文档:
  4. db.myCollection.find({ age: { $gt: 25 } })

4)更新文档:

  1. -- 更新单个文档:
  2. db.myCollection.updateOne({ name: "Alfred" }, { $set: { age: 29 } })
  3. -- 更新多个文档:
  4. db.myCollection.updateMany({ age: { $lt: 35 } }, { $set: { status: "Active" } })

5)删除文档:

  1. -- 删除单个文档,name值为'Sally'的记录:
  2. db.myCollection.deleteOne({ name: "Sally" })
  3. -- 删除多个文档,status值为'Active'的记录:
  4. db.myCollection.deleteMany({ status: "Active" })

5. 体验MongoDB聚合操作

1)创建测试用例

  1. -- 删除 sales 集合
  2. db.sales.drop()
  3. -- 创建 sales 集合并插入示例文档
  4. db.sales.insertMany([
  5. {
  6. "order_id": 1001,
  7. "product": "Laptop",
  8. "quantity": 2,
  9. "unit_price": 1200,
  10. "customer": "Alice",
  11. "order_date": ISODate("2024-06-07T08:30:00Z")
  12. },
  13. {
  14. "order_id": 1002,
  15. "product": "Monitor",
  16. "quantity": 1,
  17. "unit_price": 500,
  18. "customer": "Bob",
  19. "order_date": ISODate("2024-06-10T10:15:00Z")
  20. },
  21. {
  22. "order_id": 1003,
  23. "product": "Keyboard",
  24. "quantity": 3,
  25. "unit_price": 50,
  26. "customer": "Alice",
  27. "order_date": ISODate("2024-06-15T14:45:00Z")
  28. },
  29. {
  30. "order_id": 1004,
  31. "product": "Mouse",
  32. "quantity": 5,
  33. "unit_price": 20,
  34. "customer": "Charlie",
  35. "order_date": ISODate("2024-07-09T09:30:00Z")
  36. }
  37. ])

查询这个集合结果:

db.sales.find()

  1. mydb> db.sales.find()
  2. [
  3. {
  4. _id: ObjectId('668cf766749a72317b175646'),
  5. order_id: 1001,
  6. product: 'Laptop',
  7. quantity: 2,
  8. unit_price: 1200,
  9. customer: 'Alice',
  10. order_date: ISODate('2024-06-07T08:30:00.000Z')
  11. },
  12. {
  13. _id: ObjectId('668cf766749a72317b175647'),
  14. order_id: 1002,
  15. product: 'Monitor',
  16. quantity: 1,
  17. unit_price: 500,
  18. customer: 'Bob',
  19. order_date: ISODate('2024-06-10T10:15:00.000Z')
  20. },
  21. {
  22. _id: ObjectId('668cf766749a72317b175648'),
  23. order_id: 1003,
  24. product: 'Keyboard',
  25. quantity: 3,
  26. unit_price: 50,
  27. customer: 'Alice',
  28. order_date: ISODate('2024-06-15T14:45:00.000Z')
  29. },
  30. {
  31. _id: ObjectId('668cf766749a72317b175649'),
  32. order_id: 1004,
  33. product: 'Mouse',
  34. quantity: 5,
  35. unit_price: 20,
  36. customer: 'Charlie',
  37. order_date: ISODate('2024-07-09T09:30:00.000Z')
  38. }
  39. ]
  40. mydb>

2)执行聚合操作

示例 1: 计算每个客户的总销售额和订单数量

  1. db.sales.aggregate([
  2. {
  3. $group: {
  4. _id: "$customer",
  5. totalSales: { $sum: { $multiply: ["$quantity", "$unit_price"] } },
  6. totalOrders: { $sum: 1 }
  7. }
  8. },
  9. { $sort: { totalSales: -1 } } // 按总销售额降序排序
  10. ])

查询结果:【计算每个客户的总销售额和订单数量】

  1. [
  2. { _id: 'Alice', totalSales: 2550, totalOrders: 2 },
  3. { _id: 'Bob', totalSales: 500, totalOrders: 1 },
  4. { _id: 'Charlie', totalSales: 100, totalOrders: 1 }
  5. ]

示例 2: 查找每种产品的平均销售价格和销售数量

  1. db.sales.aggregate([
  2. {
  3. $group: {
  4. _id: "$product",
  5. avgPrice: { $avg: "$unit_price" },
  6. totalQuantity: { $sum: "$quantity" }
  7. }
  8. },
  9. { $sort: { _id: 1 } } // 按产品名称升序排序
  10. ])

查询结果:【查找每种产品的平均销售价格和销售数量】

  1. [
  2. { _id: 'Keyboard', avgPrice: 50, totalQuantity: 3 },
  3. { _id: 'Laptop', avgPrice: 1200, totalQuantity: 2 },
  4. { _id: 'Monitor', avgPrice: 500, totalQuantity: 1 },
  5. { _id: 'Mouse', avgPrice: 20, totalQuantity: 5 }
  6. ]

示例 3: 筛选特定日期范围内的销售订单并投影字段

  1. db.sales.aggregate([
  2. {
  3. $match: {
  4. order_date: {
  5. $gte: ISODate("2024-06-01"),
  6. $lte: ISODate("2024-06-30")
  7. }
  8. }
  9. },
  10. {
  11. $project: {
  12. order_id: 1,
  13. product: 1,
  14. quantity: 1,
  15. totalAmount: { $multiply: ["$quantity", "$unit_price"] }
  16. }
  17. }
  18. ])

查询结果:【筛选特定日期范围内的销售订单并投影字段】

  1. [
  2. {
  3. _id: ObjectId('668cf766749a72317b175646'),
  4. order_id: 1001,
  5. product: 'Laptop',
  6. quantity: 2,
  7. totalAmount: 2400
  8. },
  9. {
  10. _id: ObjectId('668cf766749a72317b175647'),
  11. order_id: 1002,
  12. product: 'Monitor',
  13. quantity: 1,
  14. totalAmount: 500
  15. },
  16. {
  17. _id: ObjectId('668cf766749a72317b175648'),
  18. order_id: 1003,
  19. product: 'Keyboard',
  20. quantity: 3,
  21. totalAmount: 150
  22. }
  23. ]

至此,我们学习了如何安装、启动和停止 MongoDB,并通过 MongoDB Shell 执行基础的 CRUD 操作(创建、查询、更新和删除文档),同时探索了 MongoDB 的聚合操作,用于实现复杂的数据分析。后续,会继续研究关于Oracle 23ai在JSON这方面的能力表现。

MongoDB安装、基础操作和聚合实例详解的更多相关文章

  1. C#操作SQLite方法实例详解

    用 C# 访问 SQLite 入门(1) CC++C#SQLiteFirefox  用 C# 访问 SQLite 入门 (1) SQLite 在 VS C# 环境下的开发,网上已经有很多教程.我也是从 ...

  2. MongoDB安装+基础操作

    MongoDB 一. 安装 这里展示使用docker安装mongoDB 拉取最新MongoDB镜像 docker pull mongo 运行容器 docker run -itd --name mong ...

  3. linux基础-磁盘阵列(RAID)实例详解

    磁盘阵列(RAID)实例详解 raid技术分类 软raid技术 硬raid技术 Raid和lvm的区别 为什么选择用raid RAID详解 RAID-0 RAID-1 RAID-5 Raid-10 R ...

  4. java 流操作对文件的分割和合并的实例详解_java - JAVA

    文章来源:嗨学网 敏而好学论坛www.piaodoo.com 欢迎大家相互学习 java 流操作对文件的分割和合并的实例详解 学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并. 下面是代 ...

  5. Python编程之列表操作实例详解【创建、使用、更新、删除】

    Python编程之列表操作实例详解[创建.使用.更新.删除] 这篇文章主要介绍了Python编程之列表操作,结合实例形式分析了Python列表的创建.使用.更新.删除等实现方法与相关操作技巧,需要的朋 ...

  6. Cocos2d-x 3.X手游开发实例详解

    Cocos2d-x 3.X手游开发实例详解(最新最简Cocos2d-x手机游戏开发学习方法,以热门游戏2048.卡牌为例,完整再现手游的开发过程,实例丰富,代码完备,Cocos2d-x作者之一林顺和泰 ...

  7. 转载 《AngularJS》5个实例详解Directive(指令)机制

    <AngularJS>5个实例详解Directive(指令)机制 大漠穷秋 本文整理并扩展了<AngularJS>这本书第六章里面的内容,此书近期即将由电子工业出版社出版,敬请 ...

  8. 【python3+request】python3+requests接口自动化测试框架实例详解教程

    转自:https://my.oschina.net/u/3041656/blog/820023 [python3+request]python3+requests接口自动化测试框架实例详解教程 前段时 ...

  9. python+requests接口自动化测试框架实例详解

    python+requests接口自动化测试框架实例详解   转自https://my.oschina.net/u/3041656/blog/820023 摘要: python + requests实 ...

  10. Tomcat系列之服务器的安装与配置以及各组件详解

    Tomcat系列之服务器的安装与配置以及各组件详解 大纲 一.前言 二.安装与配置Tomcat 三.Tomcat 目录的结构 四.Tomcat 配置文件 注,本文的测试的操作系统为CentOS 6.4 ...

随机推荐

  1. Idefics2 简介: 为社区而生的强大 8B 视觉语言模型

    我们很高兴在此发布 Idefics2,这是一个通用的多模态模型,接受任意文本序列和图像序列作为输入,并据此生成文本.它可用于回答图像相关的问题.描述视觉内容.基于多幅图像创作故事.从文档中提取信息以及 ...

  2. python连接redis,mongodb以及简单命令使用

    redis 环境如下: [root@mcw01 ~/msRedis]$ ps -ef|grep -v grep|grep redis root 46061 1 0 14:28 ? 00:00:45 r ...

  3. QShop商城--项目介绍

    QShop商城-项目介绍 QShop商城,是全新推出的一款轻量级.高性能.前后端分离的电商系统,支持微信小程序,前后端源码100%开源,完美支持二次开发,让您快速搭建个性化独立商城. 技术架构:.Ne ...

  4. sentinel-dashboard.jar 安装

    本文涉及的基本概念: 几种服务限流方式:熔断:拒绝流量访问,当系统恢复正常时在关闭熔断服务降级:将次要服务降级,停止服务,将系统资源释放出来给核心功能延迟处理:在前端设置一个流程缓冲池,将所有的流程全 ...

  5. 流式响应Web小工具实践

    作为一位拥有多年经验的老程序员,我对于提升Web应用性能和用户体验有些兴趣.今天,我要和大家聊聊一个非常实用的技术--流式响应(Streaming Response). 首先,流式响应到底是什么呢?简 ...

  6. 轻松绕过 Graphql 接口爬取有米有数的商品数据

    轻松绕过 Graphql 接口爬取有米有数的商品数据 有米有数数据的 API 接口,使用的是一种 API 查询语言 graphql.所有的 API 只有一个入口,具体的操作隐藏在请求数据体里面传输. ...

  7. 如何判断7z压缩文件格式

    如果压缩文件的后缀不是7z,那么如何如何判断文件格式呢?那就是通过文件头判断. 7z文件头前6位,固定是:377ABCAF271C,其中前两位37.7A分别是"7""z& ...

  8. 【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Linux/Linux Container)

    在前一篇文章中,我们是把.NET 8应用读取SSL证书(X509)示例部署在App Service Windows环境中,那么如果部署在Linux环境,以及Linux Container中呢? 根据前 ...

  9. Java中编译异常与运行异常的区别

    编译期异常和运行期异常的区别 编译期异常和运行期异常的区别如下 异常处理要求不同:编译期异常(也称为检测异常checked Exception)要求在代码中显式地处理(使用try-catch或者thr ...

  10. css作用 文本属性 颜色属性

    Css作用:美化页面 各种css属性 接触的 css属性 width: height: background: Color 选择符和声明 声明包括 属性:属性值 选择符:{ 属性:属性值 } 1:文本 ...