mongo数据库基础语法学习

mongo数据库基础语法学习

一、背景说明

MongoDB 是一个文档型 NoSQL 数据库,数据以 JSON 格式(BSON) 的文档存储,无需预定义表结构。下面我们以一个 学生成绩管理系统 为例,逐步学习常用操作。

二、准备示例数据

假设我们有一个数据库 school,其中包含一个集合 students,每个学生文档结构如下:

javascript 复制代码
{
  "_id": ObjectId("..."),
  "name": "张三",
  "gender": "男",
  "age": 20,
  "class": "计算机1班",
  "scores": [
    { "subject": "数学", "score": 88 },
    { "subject": "英语", "score": 92 },
    { "subject": "编程", "score": 95 }
  ],
  "enroll_date": ISODate("2023-09-01")
}

插入三条示例数据

javascript 复制代码
// 切换到 school 数据库(如果不存在则自动创建)
use school

// 插入单条文档
db.students.insertOne({
  name: "张三",
  gender: "男",
  age: 20,
  class: "计算机1班",
  scores: [
    { subject: "数学", score: 88 },
    { subject: "英语", score: 92 },
    { subject: "编程", score: 95 }
  ],
  enroll_date: new Date("2023-09-01")
})

// 插入多条文档
db.students.insertMany([
  {
    name: "李四",
    gender: "女",
    age: 21,
    class: "计算机1班",
    scores: [
      { subject: "数学", score: 94 },
      { subject: "英语", score: 87 },
      { subject: "编程", score: 90 }
    ],
    enroll_date: new Date("2023-09-01")
  },
  {
    name: "王五",
    gender: "男",
    age: 19,
    class: "计算机2班",
    scores: [
      { subject: "数学", score: 76 },
      { subject: "英语", score: 88 },
      { subject: "编程", score: 82 }
    ],
    enroll_date: new Date("2024-02-15")
  }
])

三、基础查询(CRUD 之 Read)

查询所有文档

javascript 复制代码
db.students.find()                         // 返回所有文档
db.students.find().pretty()                // 格式化输出

条件查询

javascript 复制代码
// 相等条件
db.students.find({ name: "张三" })

// 比较操作符
db.students.find({ age: { $gt: 20 } })     // 年龄大于20
db.students.find({ age: { $gte: 20, $lte: 22 } })  // 20 <= age <= 22

// 多条件(AND)
db.students.find({ gender: "男", class: "计算机1班" })

// OR 条件
db.students.find({
  $or: [
    { name: "张三" },
    { class: "计算机2班" }
  ]
})

查询内嵌文档(数组)

javascript 复制代码
// 查询"数学"成绩大于90的学生
db.students.find({ "scores.subject": "数学", "scores.score": { $gt: 90 } })

// 使用 $elemMatch 确保同一数组元素同时满足多个条件
db.students.find({
  scores: { $elemMatch: { subject: "编程", score: { $gte: 90 } } }
})

投影(只返回指定字段)

javascript 复制代码
// 只返回 name 和 age,_id 默认返回,设为0可排除
db.students.find({}, { name: 1, age: 1, _id: 0 })

排序、限制、跳过

javascript 复制代码
db.students.find().sort({ age: -1 })        // 按年龄降序
db.students.find().limit(2)                 // 只取前2条
db.students.find().skip(1).limit(1)         // 分页:跳过1条取1条

四、插入数据(Create)

javascript 复制代码
// 插入单条
db.students.insertOne({ name: "赵六", age: 22, class: "计算机1班", scores: [] })

// 插入多条
db.students.insertMany([
  { name: "孙七", age: 20, class: "计算机2班" },
  { name: "周八", age: 21, class: "计算机1班" }
])

五、更新数据(Update)

更新语法:db.collection.updateOne(filter, update, options) 或 updateMany

常用更新操作符

javascript 复制代码
// $set:修改字段(若字段不存在则添加)
db.students.updateOne(
  { name: "张三" },
  { $set: { age: 21, phone: "13800000000" } }
)

// $inc:数值增减
db.students.updateMany(
  { class: "计算机1班" },
  { $inc: { age: 1 } }           // 全班年龄加1
)

// $push:向数组添加元素
db.students.updateOne(
  { name: "赵六" },
  { $push: { scores: { subject: "体育", score: 85 } } }
)

// $pull:从数组中删除符合条件元素
db.students.updateOne(
  { name: "张三" },
  { $pull: { scores: { subject: "英语" } } }
)

替换整个文档(使用 replaceOne)

javascript 复制代码
db.students.replaceOne(
  { name: "赵六" },
  { name: "赵六新", age: 23, class: "计算机3班" }   // 原 scores 等字段会丢失
)

六、删除数据(Delete)

javascript 复制代码
// 删除匹配的第一条
db.students.deleteOne({ name: "周八" })

// 删除所有匹配的文档
db.students.deleteMany({ class: "计算机2班" })

// 删除整个集合(谨慎)
db.students.drop()

七、聚合查询(Aggregation Pipeline)

聚合管道用于复杂统计,常见阶段: m a t c h 、 match、 match、group、 p r o j e c t 、 project、 project、sort、$unwind。

示例1:统计每个班级的平均年龄

javascript 复制代码
db.students.aggregate([
  { $group: { _id: "$class", avgAge: { $avg: "$age" } } },
  { $sort: { avgAge: -1 } }
])

示例2:计算每位学生的总分,并筛选总分≥250的学生

javascript 复制代码
db.students.aggregate([
  { $unwind: "$scores" },                     // 将数组拆成多条文档
  { $group: { _id: "$name", totalScore: { $sum: "$scores.score" } } },
  { $match: { totalScore: { $gte: 250 } } },
  { $sort: { totalScore: -1 } }
])

示例3:$project 重命名字段、计算新字段

javascript 复制代码
db.students.aggregate([
  { $project: {
    studentName: "$name",
    age: 1,
    isAdult: { $gte: ["$age", 18] },
    firstScore: { $arrayElemAt: ["$scores.score", 0] }
  } }
])

八、索引

索引加速查询,但会降低写入性能。

javascript 复制代码
// 创建单字段索引
db.students.createIndex({ name: 1 })          // 1升序,-1降序

// 创建唯一索引(防止重复)
db.students.createIndex({ name: 1 }, { unique: true })

// 复合索引
db.students.createIndex({ class: 1, age: -1 })

// 查看已有索引
db.students.getIndexes()

// 删除索引
db.students.dropIndex("name_1")

九、常用辅助方法

javascript 复制代码
// 统计文档数量
db.students.countDocuments({ age: { $gt: 20 } })

// 去重
db.students.distinct("class")

// 查看执行计划(分析查询性能)
db.students.find({ name: "张三" }).explain("executionStats")

十、总结表

相关推荐
weelinking5 小时前
【2026】08_Claude与版本控制:Git协作技巧
数据库·人工智能·git·python·数据挖掘·交互·cloudera
凉、介9 小时前
Armv8-A virtualization 笔记 (二)
笔记·学习·嵌入式·arm·gic
黄焖鸡能干四碗10 小时前
固定资产管理系统建设方案和源码(Java源码)
大数据·数据库·人工智能·物联网·区块链
JoneBB10 小时前
ABAP Webservice连接
运维·开发语言·数据库·学习
解决问题no解决代码问题11 小时前
从乱码到脱敏导出:TiDB CSV 导出实战全指南
数据库
未若君雅裁11 小时前
MySQL高可用与扩展-主从复制读写分离分库分表
java·数据库·mysql
2401_8676239811 小时前
CSS Flex布局中如何设置子元素间距_掌握gap属性的现代用法
jvm·数据库·python
月落归舟11 小时前
一篇文章了解Redis内存淘汰机制与过期Key清理
数据库·redis·mybatis
嵌入式小企鹅11 小时前
UiPath推出AI编程“总指挥台”,SiFive发布RISC-V第三代猛兽
人工智能·学习·google·程序员·ai编程·risc-v·开源工具
phltxy11 小时前
Redis 事务
数据库·redis·缓存