MongoDB基本语法

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 } }
)

该命令更新 nameAlice 的文档,将其 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" })

该命令删除 nameJohn 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 })

该命令为 nameage 字段创建复合索引,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 应用程序开发中的大规模数据处理场景。

相关推荐
tatasix39 分钟前
MySQL UPDATE语句执行链路解析
数据库·mysql
南城花随雪。1 小时前
硬盘(HDD)与固态硬盘(SSD)详细解读
数据库
儿时可乖了1 小时前
使用 Java 操作 SQLite 数据库
java·数据库·sqlite
懒是一种态度1 小时前
Golang 调用 mongodb 的函数
数据库·mongodb·golang
天海华兮1 小时前
mysql 去重 补全 取出重复 变量 函数 和存储过程
数据库·mysql
gma9992 小时前
Etcd 框架
数据库·etcd
爱吃青椒不爱吃西红柿‍️2 小时前
华为ASP与CSP是什么?
服务器·前端·数据库
Yz98762 小时前
hive的存储格式
大数据·数据库·数据仓库·hive·hadoop·数据库开发
苏-言3 小时前
Spring IOC实战指南:从零到一的构建过程
java·数据库·spring
Ljw...3 小时前
索引(MySQL)
数据库·mysql·索引