mongo数据库基础语法学习
- 一、背景说明
- 二、准备示例数据
- [三、基础查询(CRUD 之 Read)](#三、基础查询(CRUD 之 Read))
- 四、插入数据(Create)
- 五、更新数据(Update)
- 六、删除数据(Delete)
- [七、聚合查询(Aggregation Pipeline)](#七、聚合查询(Aggregation Pipeline))
- 八、索引
- 九、常用辅助方法
- 十、总结表
一、背景说明
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")
十、总结表
