MongoDB入门

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 重要警告处理

  1. 文件系统建议:官方推荐使用XFS而非ext4

  2. 访问控制警告:初始安装后无访问限制,需后续配置用户认证

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的核心技能,可以开始构建高性能的数据库应用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值