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")

十、总结表

相关推荐
jvvz afqh2 小时前
MySQL Workbench菜单汉化为中文
android·数据库·mysql
墨者阳2 小时前
可观・可控・可治:DB运维平台架构设计与实践
运维·数据库·架构·自动化·数据可视化
Mrssory2 小时前
Postgresql数据库快速入门
数据库·postgresql
小脑斧1232 小时前
DBExport2.51 Oracle数据库查询与Excel数据导出工具
数据库·oracle·excel
Java爱好狂.2 小时前
Redis高级笔记:原理+集群+应用+拓展+源码
java·数据库·redis·spring·java面试·后端开发·java八股文
牛八里昂2 小时前
DeepAgents 学习
学习
djjdjdjdjjdj2 小时前
CSS如何实现元素淡入淡出显示_结合animation与opacity属性
jvm·数据库·python
m0_684501982 小时前
Go 中实现方法级执行时间监控的生产就绪方案
jvm·数据库·python
LiAo_1996_Y2 小时前
Python机器学习怎么防止数据泄漏_确保Scaler在Pipeline内拟合
jvm·数据库·python