1. NoSQL 与 MongoDB 简介
1.1 NoSQL 概述
NoSQL(Not Only SQL)是一种非关系型数据库:
-
诞生背景:1998年首次提出概念,2009年随着Web2.0发展而兴起
-
特点:高扩展性、大数据量高性能、灵活数据模型、高可用性
-
应用场景:Facebook、Google、淘宝、京东等大型互联网公司广泛使用
1.2 MongoDB 简介
MongoDB是由C++编写的开源NoSQL数据库,基于分布式文件存储:
-
层级结构:数据库 > 集合(Collection) > 文档(Document)
-
核心优势:
-
易扩展:无固定表结构,数据间无关联
-
高性能:尤其适合大数据量场景
-
灵活数据模型:无需预定义字段,随时可存储自定义格式
-
1.3 与关系型数据库对比
| SQL概念 | MongoDB对应概念 | 说明 |
|---|---|---|
| 数据库(Database) | 数据库 | 存储数据的容器 |
| 表(Table) | 集合(Collection) | 文档的容器,类似表但不强制结构 |
| 行(Row) | 文档(Document) | JSON格式的一条数据记录 |
| 列(Column) | 字段(Field) | 文档中的键值对 |
| 主键(Primary Key) | 对象ID(ObjectId) | 自动生成的唯一标识 _id:ObjectId() |
| 索引(Index) | 索引(Index) | 加速查询的机制 |
2. MongoDB 安装与配置
2.1 安装步骤(Ubuntu为例)
sudo apt-get install mongodb
2.2 服务管理命令
# 检查服务状态
sudo systemctl status mongodb
# 启动/停止/重启
sudo service mongodb start
sudo service mongodb stop
sudo service mongodb restart
# 验证是否启动
ps ajx|grep mongodb
2.3 重要路径
-
配置文件:
/etc/mongodb.conf -
默认端口:27017
-
日志文件:
/var/log/mongodb/mongodb.log
2.4 客户端操作
# 启动客户端
mongo
# 查看帮助
mongo -help
# 退出
exit 或 Ctrl+C
2.5 重要警告处理
-
文件系统建议:官方推荐使用XFS而非ext4
-
访问控制警告:初始安装后无访问限制,需后续配置用户认证
3. 数据库基础操作
3.1 数据库命令
// 查看当前数据库
db
// 查看所有数据库
show dbs 或 show databases
// 切换数据库
use db_name
// 删除当前数据库
db.dropDatabase()
// 查看服务器状态
db.serverStatus()
3.2 集合操作
// 自动创建集合(插入数据时自动创建)
db.不存在集合.insert({name:"test"})
// 手动创建集合
db.createCollection("集合名")
db.createCollection("sub", { capped: true, size: 300 }) // 设置上限
// 查看集合
show collections
// 删除集合
db.集合名称.drop()
3.3 数据类型
MongoDB支持丰富的数据类型:
-
ObjectId:文档唯一标识 -
String:UTF-8字符串 -
Boolean:true/false -
Integer:32/64位整数 -
Double:浮点数 -
Arrays:数组/列表 -
Object:嵌套文档(类似字典) -
Null:空值 -
Timestamp:时间戳 -
Date:日期对象
3.4 ObjectId详解
-
12字节十六进制数组成:
-
前4字节:时间戳
-
接下来3字节:机器ID
-
接着2字节:服务进程ID
-
最后3字节:简单增量值
-
-
可自定义或自动生成
// 创建日期对象
new Date('2020-12-1')
4. CRUD 操作(增删改查)
4.1 插入文档
// 插入单条
db.stu.insert({name:'rose', gender:1})
db.stu.insert({_id:"20210101", name:'jack', gender:1})
// 插入多条
db.stu.insertMany([
{name:'Alice', age:20},
{name:'Bob', age:22}
])
4.2 保存文档
// _id存在则更新,不存在则插入
db.stu.save({_id:'20210101', name:'rose', sex:2})
4.3 查询文档
// 查询所有
db.stu.find()
// 格式化输出
db.stu.find().pretty()
4.4 更新文档
// 更新语法
db.集合.update(
<query>,
<update>,
{multi: <boolean>}
)
// 示例
db.stu.update({name:'hr'}, {name:'mrc'}) // 更新一条
db.stu.update({name:'hr'}, {$set:{name:'hys'}}) // 使用$set部分更新
db.stu.update({}, {$set:{gender:0}}, {multi:true}) // 更新所有
4.5 删除文档
db.集合.remove(
<query>,
{justOne: <boolean>}
)
// 示例
db.stu.remove({name:'hr'}) // 删除所有匹配
db.stu.remove({name:'hr'}, {justOne:true}) // 只删一条
5. 高级查询技巧
5.1 比较运算符
// 等于(默认)
db.stu.find({age:18})
// 其他比较
db.stu.find({age:{$lt:18}}) // 小于
db.stu.find({age:{$lte:18}}) // 小于等于
db.stu.find({age:{$gt:18}}) // 大于
db.stu.find({age:{$gte:18}}) // 大于等于
db.stu.find({age:{$ne:18}}) // 不等于
5.2 逻辑运算符
// AND(多个条件)
db.stu.find({age:{$gte:18}, gender:true})
// OR
db.stu.find({$or:[{age:{$gt:18}}, {gender:false}]})
// 混合使用
db.stu.find({$or:[{age:{$gte:18}},{gender:true}], name:'rose'})
5.3 范围查询
// $in/$nin
db.stu.find({age:{$in:[18,28]}}) // 年龄为18或28
db.stu.find({age:{$nin:[18,28]}}) // 年龄不为18和28
5.4 正则表达式
// 查询姓黄的学生
db.stu.find({name:/^黄/})
db.stu.find({name:{$regex:'^黄'}})
5.5 分页查询
// limit和skip
db.stu.find().limit(2) // 前2条
db.stu.find().skip(2) // 跳过前2条
db.stu.find().skip(5).limit(4) // 第6-9条
5.6 自定义查询
// 使用JavaScript函数
db.stu.find({
$where: function() {
return this.age > 30;
}
})
5.7 投影(字段筛选)
// 只显示name和gender字段
db.stu.find({}, {_id:0, name:1, gender:1})
5.8 排序
// 1升序,-1降序
db.stu.find().sort({gender:-1, age:1})
5.9 统计
db.stu.find({gender:true}).count()
db.stu.count({age:{$gt:20}, gender:true})
5.10 去重
db.stu.distinct('hometown', {age:{$gt:18}})
6. 聚合管道
6.1 常用管道操作符
-
$group:分组统计 -
$match:数据过滤 -
$project:字段投影 -
$sort:结果排序 -
$limit:限制结果数 -
$skip:跳过文档 -
$unwind:展开数组
6.2 常用表达式
-
$sum:求和 -
$avg:平均值 -
$min/$max:最小/最大值 -
$push:添加值到数组 -
$first/$last:获取首/末文档
6.3 聚合示例
// 统计男女数量
db.stu.aggregate([
{$group: {_id:'$gender', counter:{$sum:1}}}
])
// 查询年龄>20的男生女生人数
db.stu.aggregate([
{$match: {age:{$gt:20}}},
{$group: {_id:'$gender', counter:{$sum:1}}}
])
// 按人数降序输出
db.stu.aggregate([
{$group: {_id:'$gender', counter:{$sum:1}}},
{$sort: {counter:-1}}
])
6.4 $unwind 展开数组
// 原始数据
db.t2.insert({_id:1, item:'t-shirt', size:['S','M','L']})
// 展开后
db.t2.aggregate({$unwind:'$size'})
/*
{ "_id":1, "item":"t-shirt", "size":"S" }
{ "_id":1, "item":"t-shirt", "size":"M" }
{ "_id":1, "item":"t-shirt", "size":"L" }
*/
7. 索引优化
7.1 创建索引
// 单字段索引
db.test3.ensureIndex({fname:1}) // 1升序,-1降序
// 唯一索引
db.test3.ensureIndex({name:1}, {unique:true})
// 联合索引
db.test3.ensureIndex({name:1, age:1})
7.2 索引管理
// 查看索引
db.test3.getIndexes()
// 删除索引
db.test3.dropIndex("索引名称")
7.3 索引效果验证
javascript
// 分析查询性能
db.test3.find({fname:'test99999'}).explain('executionStats')
8. 数据备份与恢复
8.1 备份
mongodump -h 主机:端口 -d 数据库名 -o 备份目录
# 示例
mongodump -h 192.168.1.100:27017 -d test1 -o ~/backup
8.2 恢复
mongorestore -h 主机:端口 -d 数据库名 --dir 备份目录
# 示例
mongorestore -h 192.168.1.100:27017 -d test2 --dir ~/backup/test1
9. Python 操作 MongoDB
9.1 基本操作
from pymongo import MongoClient
# 连接数据库
client = MongoClient(host="127.0.0.1", port=27017)
collection = client["demo"]["t516"]
# 插入单条
ret = collection.insert_one({"_id": 11, "name": "rose", "age": 20})
# 插入多条
data_list = [{"name":f"test{i}"} for i in range(10)]
collection.insert_many(data_list)
9.2 查询操作
# 查询单条
result = collection.find_one({"name": "test10005"})
# 查询多条
results = collection.find({"name": "test10005"})
for item in results:
print(item)
9.3 更新操作
# 更新单条
collection.update_one(
{"name": "test10005"},
{"$set": {"name": "new_test10005"}}
)
# 更新多条
collection.update_many(
{"name": "test10005"},
{"$set": {"name": "new_test10005"}}
)
9.4 删除操作
# 删除单条
collection.delete_one({"name": "test10010"})
# 删除多条
collection.delete_many({"name": "test10010"})
10. 实战练习
10.1 批量插入数据
from pymongo import MongoClient
client = MongoClient("127.0.0.1", 27017)
collection = client["test"]["t3"]
# 插入1000条数据
data = [{"_id": i, "name": f"py{i}"} for i in range(1000)]
collection.insert_many(data)
10.2 查询特定文档
# 查询_id为100的倍数的文档
results = collection.find({"_id": {"$mod": [100, 0]}})
for doc in results:
print(doc["name"])
总结
本文全面介绍了MongoDB从安装配置到高级查询的所有核心知识,包括:
-
NoSQL概念与MongoDB特点
-
数据库基本操作与CRUD
-
丰富的查询技巧与聚合管道
-
索引优化与性能提升
-
数据备份恢复策略
-
Python集成开发
MongoDB以其灵活的数据模型和出色的扩展性,成为现代应用开发的重要选择。通过本指南,您已掌握MongoDB的核心技能,可以开始构建高性能的数据库应用。
1288

被折叠的 条评论
为什么被折叠?



