MongoDB
1109字约4分钟
数据库MongoDB
2024-11-16
MongoDB 是一种流行的NoSQL数据库,使用文档模型来存储数据。它提供了强大的查询语言和丰富的功能。
MongoDB 语法基础教程
一、基本概念
- 数据库:MongoDB中的数据库是一个容器,用于存储集合。
- 集合:集合类似于关系型数据库中的表,是文档的容器。
- 文档:文档是MongoDB的基本数据单元,使用类似JSON的格式(BSON)存储。
二、连接和基本操作
1. 连接到MongoDB
使用MongoDB Shell连接到MongoDB服务器:
mongo指定数据库(如果不存在则创建):
use myDatabase;
2. 数据库操作
查看所有数据库
show dbs删除数据库
db.dropDatabase()
三、集合操作
1. 创建和删除集合
创建集合
db.createCollection("myCollection")查看当前数据库中的所有集合
show collections删除集合
db.myCollection.drop()
四、文档操作
1. 插入文档
插入单个文档
db.myCollection.insertOne({ name: "Alice", age: 25, city: "New York" })插入多个文档
db.myCollection.insertMany([ { name: "Bob", age: 30, city: "San Francisco" }, { name: "Charlie", age: 35, city: "Los Angeles" } ])
2. 查询文档
查询所有文档
db.myCollection.find()查询特定条件的文档
db.myCollection.find({ age: { $gt: 25 } })格式化输出
db.myCollection.find().pretty()
3. 更新文档
更新单个文档
db.myCollection.updateOne( { name: "Alice" }, { $set: { age: 26 } } )更新多个文档
db.myCollection.updateMany( { city: "New York" }, { $set: { city: "NYC" } } )替换文档
db.myCollection.replaceOne( { name: "Alice" }, { name: "Alice", age: 27, city: "Boston" } )
4. 删除文档
删除单个文档
db.myCollection.deleteOne({ name: "Charlie" })删除多个文档
db.myCollection.deleteMany({ age: { $lt: 30 } })
五、索引操作
创建索引
db.myCollection.createIndex({ name: 1 })查看集合的索引
db.myCollection.getIndexes()删除索引
db.myCollection.dropIndex("name_1")
六、聚合操作
使用聚合管道
db.myCollection.aggregate([ { $match: { age: { $gte: 25 } } }, { $group: { _id: "$city", total: { $sum: 1 } } } ])
七、高级查询操作
1. 数组查询
MongoDB支持对数组字段的查询操作:
// 查询包含特定元素的数组
db.myCollection.find({hobbies: "reading"})
// 查询数组长度
db.myCollection.find({"hobbies": {$size: 3}})
// 查询数组中满足条件的元素
db.myCollection.find({"scores": {$elemMatch: {$gte: 80, $lt: 90}}})2. 正则表达式查询
// 使用正则表达式查询
db.myCollection.find({name: /alice/i})
// 使用$regex操作符
db.myCollection.find({name: {$regex: "^A"}})3. 投影操作
// 只返回指定字段
db.myCollection.find({}, {name: 1, age: 1})
// 排除_id字段
db.myCollection.find({}, {name: 1, age: 1, _id: 0})八、数据类型
MongoDB支持多种数据类型:
- String:字符串
- Integer:整数
- Boolean:布尔值
- Double:双精度浮点数
- Arrays:数组
- Object:对象
- Null:空值
- Timestamp:时间戳
- Date:日期时间
九、复制集和分片
1. 复制集(Replica Set)
复制集是一组维护相同数据集的MongoDB实例,提供高可用性和数据冗余。
2. 分片(Sharding)
分片是MongoDB的水平扩展机制,将数据分布在多个服务器上。
十、性能优化
1. 索引优化
- 创建复合索引以支持复杂的查询模式
- 使用覆盖索引避免读取实际文档
- 定期重建索引以提高性能
2. 查询优化
- 使用explain()分析查询性能
- 避免在查询中使用正则表达式(除非必要)
- 使用limit()限制返回结果数量
3. 数据建模
- 根据查询模式设计文档结构
- 考虑嵌入式文档vs引用式文档
- 避免过度嵌套的文档结构
十一、备份和恢复
1. 使用mongodump备份
mongodump --db myDatabase --out /backup/2. 使用mongorestore恢复
mongorestore --db myDatabase /backup/myDatabase/十二、安全
1. 用户认证
// 创建用户
db.createUser({
user: "myUser",
pwd: "myPassword",
roles: [{role: "readWrite", db: "myDatabase"}]
})
// 启用认证
// 在mongod.conf中设置security.authorization: enabled2. 角色管理
MongoDB提供多种内置角色:
- read:读取权限
- readWrite:读写权限
- dbAdmin:数据库管理权限
- userAdmin:用户管理权限
- clusterAdmin:集群管理权限
十三、监控和诊断
1. 数据库状态
// 查看数据库状态
db.stats()
// 查看集合状态
db.myCollection.stats()2. 性能监控
// 查看当前操作
db.currentOp()
// 终止操作
db.killOp(opId)十四、最佳实践
1. 设计原则
- 根据读写模式设计文档结构
- 合理使用索引避免性能问题
- 定期监控和优化数据库性能
2. 开发建议
- 使用连接池管理数据库连接
- 避免N+1查询问题
- 合理处理异常和错误
3. 运维建议
- 定期备份重要数据
- 监控数据库性能指标
- 及时更新MongoDB版本
