MongoDB 基本语法详解
MongoDB 是一种面向文档的 NoSQL 数据库,支持灵活的数据结构和高扩展性,广泛应用于现代应用程序开发。MongoDB 采用 BSON(Binary JSON)格式存储数据,使得其能够存储复杂嵌套的结构。
1. 数据库和集合操作
MongoDB 中的数据库和集合类似于关系型数据库中的数据库和表。每个 MongoDB 实例可以包含多个数据库,每个数据库包含多个集合(collection)。集合中存储的是 BSON 格式的文档。
1.1 创建/切换数据库
bash
use myDatabase
该命令会创建一个名为 myDatabase
的数据库(如果不存在),并切换到该数据库。
1.2 查看当前数据库
bash
db
使用 db
命令可以显示当前连接的数据库名称。
1.3 查看所有数据库
bash
show dbs
该命令用于显示 MongoDB 实例中的所有数据库。
1.4 删除数据库
bash
db.dropDatabase()
该命令会删除当前连接的数据库及其所有数据。
2. 集合操作
2.1 创建集合
bash
db.createCollection("myCollection")
手动创建一个名为 myCollection
的集合。MongoDB 是动态模式(schema-less)的,所以即使不显式创建集合,在插入数据时 MongoDB 也会自动创建。
2.2 查看集合
bash
show collections
查看当前数据库中的所有集合。
2.3 删除集合
bash
db.myCollection.drop()
删除名为 myCollection
的集合及其中的所有文档。
3. 文档的 CRUD 操作
文档是 MongoDB 中的基本数据单元,它以 BSON 格式存储,类似于 JSON 对象。接下来我们将详细介绍文档的增删改查操作。
3.1 插入文档
MongoDB 提供了三种插入文档的方式:insertOne()
、insertMany()
和 insert()
。
3.1.1 插入单个文档
bash
db.myCollection.insertOne({
name: "John Doe",
age: 30,
address: { city: "New York", zip: "10001" }
})
该命令在集合 myCollection
中插入一条文档。
3.1.2 插入多个文档
bash
db.myCollection.insertMany([
{ name: "Alice", age: 25 },
{ name: "Bob", age: 28 }
])
insertMany()
用于一次插入多条文档。
3.1.3 插入数据自动创建集合
即使集合不存在,执行插入操作时 MongoDB 会自动创建集合。
3.2 查询文档
MongoDB 支持强大的查询功能,可以根据条件筛选出符合要求的文档。
3.2.1 查询所有文档
bash
db.myCollection.find()
该命令返回集合中的所有文档。
3.2.2 条件查询
bash
db.myCollection.find({ age: { $gt: 25 } })
find()
函数可以传入查询条件,这里 { $gt: 25 }
表示查找 age
字段大于 25 的文档。
3.2.3 限制返回字段
bash
db.myCollection.find({ age: { $gt: 25 } }, { name: 1, _id: 0 })
该命令查询 age
大于 25 的文档,并只返回 name
字段,_id
字段不返回。
3.2.4 查询单个文档
bash
db.myCollection.findOne({ name: "Alice" })
该命令返回第一个符合条件的文档。
3.2.5 查询结果排序
bash
db.myCollection.find().sort({ age: -1 })
该命令按 age
字段降序排列结果。
3.2.6 查询结果分页
bash
db.myCollection.find().limit(5).skip(10)
该命令返回查询结果中的第 11 到第 15 条文档,适用于分页功能。
3.3 更新文档
MongoDB 提供 updateOne()
、updateMany()
和 replaceOne()
来更新文档。
3.3.1 更新单个文档
bash
db.myCollection.updateOne(
{ name: "Alice" },
{ $set: { age: 26 } }
)
该命令更新 name
为 Alice
的文档,将其 age
字段更新为 26。
3.3.2 更新多个文档
bash
db.myCollection.updateMany(
{ age: { $lt: 30 } },
{ $set: { status: "young" } }
)
该命令将所有 age
小于 30 的文档的 status
字段设置为 young
。
3.3.3 替换文档
bash
db.myCollection.replaceOne(
{ name: "Bob" },
{ name: "Robert", age: 35 }
)
replaceOne()
替换整个文档,而不仅仅是更新部分字段。
3.4 删除文档
3.4.1 删除单个文档
bash
db.myCollection.deleteOne({ name: "John Doe" })
该命令删除 name
为 John Doe
的文档。
3.4.2 删除多个文档
bash
db.myCollection.deleteMany({ age: { $gt: 30 } })
该命令删除所有 age
大于 30 的文档。
4. 索引操作
MongoDB 支持在字段上创建索引以加快查询速度,类似于关系型数据库中的索引。
4.1 创建单字段索引
bash
db.myCollection.createIndex({ name: 1 })
该命令为 name
字段创建升序索引。
4.2 创建复合索引
bash
db.myCollection.createIndex({ name: 1, age: -1 })
该命令为 name
和 age
字段创建复合索引,name
字段升序,age
字段降序。
4.3 查看集合索引
bash
db.myCollection.getIndexes()
该命令查看集合中的所有索引。
4.4 删除索引
bash
db.myCollection.dropIndex("name_1")
该命令删除名为 name_1
的索引。
5. 聚合操作
MongoDB 提供了功能强大的聚合框架,允许在查询过程中进行数据处理和转换。
5.1 聚合管道
bash
db.myCollection.aggregate([
{ $match: { age: { $gte: 25 } } },
{ $group: { _id: "$status", avgAge: { $avg: "$age" } } }
])
该命令首先筛选出 age
大于等于 25 的文档,然后按照 status
字段分组并计算每组的平均年龄。
5.2 聚合阶段常用操作
$match
:过滤数据,类似于find()
。$group
:按某个字段分组并计算聚合值。$project
:选择和重命名返回的字段。$sort
:对结果进行排序。
6. 常用运算符
MongoDB 提供了一些常用的查询和更新运算符,用于处理各种复杂的查询和数据操作。
6.1 查询运算符
$gt
:大于$lt
:小于$gte
:大于等于$lte
:小于等于$ne
:不等于$in
:包含于数组$nin
:不包含于数组$exists
:字段是否存在
6.2 更新运算符
$set
:设置字段值$inc
:增加字段值$unset
:删除字段$push
:向数组字段追加元素$pull
:从数组字段删除元素
7. 安全与权限
MongoDB 支持用户认证和角色管理,可以根据角色对数据库进行权限控制。
7.1 创建用户
bash
db.createUser({
user: "myUser",
pwd: "password",
roles: [ { role: "readWrite", db: "myDatabase" } ]
})
该命令创建一个 myUser
用户,并赋予其对 `myDatabase
` 的读写权限。
7.2 删除用户
bash
db.dropUser("myUser")
删除名为 myUser
的用户。
结论
本文详细介绍了 MongoDB 的基本语法,从数据库和集合的操作,到文档的 CRUD、索引、聚合,以及常见的查询和更新运算符。MongoDB 具有极大的扩展性和灵活性,适合现代 Web 应用程序开发中的大规模数据处理场景。