1. MongoDB简介
MongoDB是一个开源的文档型数据库,属于NoSQL数据库的一种。它以其高性能、高可用性和易扩展性而闻名。MongoDB使用BSON(Binary JSON)格式存储数据,这使得它非常适合处理大量的非结构化数据。
主要特点:
- 文档型存储:数据以类JSON格式存储
- 灵活的数据模型:无需预定义模式
- 强大的查询语言:支持CRUD操作和复杂查询
- 高性能:支持索引,包括文本搜索和地理空间索引
- 高可用性:通过复制集实现
- 水平扩展:通过分片实现
2. 安装MongoDB
在Ubuntu上安装:
sudo apt-get update
sudo apt-get install -y mongodb
在macOS上使用Homebrew安装:
brew tap mongodb/brew
brew install mongodb-community
3. 基本操作
连接到MongoDB:
mongo
创建数据库:
use mydb
创建集合并插入文档:
db.users.insertOne({
name: "John Doe",
age: 30,
email: "john@example.com"
})
查询文档:
db.users.find({name: "John Doe"})
更新文档:
db.users.updateOne(
{name: "John Doe"},
{$set: {age: 31}}
)
删除文档:
db.users.deleteOne({name: "John Doe"})
4. 高级查询
复合查询:
db.users.find({
age: {$gt: 25, $lt: 35},
"address.city": "New York"
})
聚合管道:
db.orders.aggregate([
{$match: {status: "completed"}},
{$group: {_id: "$customerId", total: {$sum: "$amount"}}}
])
5. 索引
创建索引:
db.users.createIndex({email: 1})
创建复合索引:
db.users.createIndex({name: 1, age: -1})
文本索引:
db.articles.createIndex({content: "text"})
6. 数据建模
在MongoDB中,数据建模的关键是选择嵌入式文档还是引用。
嵌入式文档:
{
_id: ObjectId("5099803df3f4948bd2f98391"),
name: "Joe Smith",
contacts: [
{type: "email", value: "joe@example.com"},
{type: "phone", value: "555-123-4567"}
]
}
引用:
// 用户文档
{
_id: ObjectId("5099803df3f4948bd2f98391"),
name: "Joe Smith"
}
// 联系方式文档
{
_id: ObjectId("5099803df3f4948bd2f98392"),
user_id: ObjectId("5099803df3f4948bd2f98391"),
type: "email",
value: "joe@example.com"
}
7. 复制集
复制集提供了数据冗余和高可用性。
配置复制集:
- 启动多个MongoDB实例
- 初始化复制集:
rs.initiate()
rs.add("mongodb1.example.net")
rs.add("mongodb2.example.net")
8. 分片
分片允许水平扩展MongoDB集群。
配置分片:
- 配置分片集群(配置服务器、mongos路由器、分片)
- 启用数据库分片:
sh.enableSharding("mydb")
- 对集合进行分片:
sh.shardCollection("mydb.users", {_id: "hashed"})
9. 安全性
启用身份验证:
- 创建管理员用户:
use admin
db.createUser({
user: "adminUser",
pwd: "secretPassword",
roles: [{role: "userAdminAnyDatabase", db: "admin"}]
})
- 启动MongoDB时启用身份验证:
mongod --auth
启用TLS/SSL:
配置MongoDB以使用SSL证书,确保数据传输的安全性。
10. 性能优化
- 使用适当的索引
- 避免大型文档
- 使用投影限制返回的字段
- 批量操作代替单一操作
- 使用聚合管道而不是map-reduce
- 监控和分析查询性能(使用
explain()
)
结语
MongoDB是一个强大而灵活的数据库系统,适用于各种应用场景。从基本的CRUD操作到高级的分片和复制,MongoDB提供了丰富的功能来满足现代应用程序的需求。随着对MongoDB的深入学习和实践,您将能够充分利用它的特性,构建高效、可扩展的应用程序。
进一步学习资源
通过不断学习和实践,您将能够掌握MongoDB的高级特性,成为一名出色的MongoDB开发者。祝您在MongoDB的学习之旅中取得成功!