1. 数据库
1.1 创建数据库
MongoDB默认的数据库为test,如果没有创建新的数据库,集合将存放在test数据库中。
当通过shell连接MongoDB实例是,如果没有使用use 命令切换到其他数据库,则会默认使test数据库
首次向MongoDB中插入数据时,如果数据库不存在,MongoDB会自动创建它,只需要选择一个数据库名称,并开始向其插入文档即可
1 | use databaseName #如果xiaoyuge数据库不存在,则会创建一个xiaoyuge数据库 |
数据库的创建是自动的,不需要显式的创建,除非需要在创建是指定特定的配置选项,只有在数据库至少有一个集合时,数据库才会在show dbs中输出显示
1.2 删除数据库
如果需要删除数据库,可以使用db.dropDatabase()
方法
2. 集合
2.1 创建集合
语法格式:db.createCollection(name, options)
name: 要创建的集合名称
options:可选参数,指定内存大小以及索引的选项
options可以是如下参数:
参数名 | 类型 | 描述 | 示例值 |
---|---|---|---|
capped | 布尔值 | 是否创建一个固定大小的集合 | true |
size | 数值 | 集合的最大大小(以字节为单位)。仅在 capped 为 true 时有效 | 10485760 (10MB) |
max | 数值 | 集合中允许的最大文档数。仅在 capped 为 true 时有效。 | 5000 |
validator | 对象 | 用于文档验证的表达式 | { $jsonSchema: { … }} |
validationLevel | 字符串 | 指定文档验证的严格程度。 “off”:不进行验证。 “strict”:插入和更新操作都必须通过验证(默认)。 “moderate”:仅现有文档更新时必须通过验证,插入新文档时不需要。 |
“strict” |
validationAction | 字符串 | 指定文档验证失败时的操作。 “error”:阻止插入或更新(默认)。 “warn”:允许插入或更新,但会发出警告。 |
“error” |
storageEngine | 对象 | 为集合指定存储引擎配置。 | { wiredTiger: { … }} |
collation | 对象 | 指定集合的默认排序规则 | { locale: “en”, strength: 2 } |
示例代码:
1 | db.createCollection("myComplexCollection", { |
这个例子创建了一个集合,具有以下特性:
固定大小,最大 10MB,最多存储 5000 个文档。
文档必须包含 name 和 email 字段,其中 name 必须是字符串,email 必须是有效的电子邮件格式。
验证级别为严格,验证失败将阻止插入或更新。
使用 WiredTiger 存储引擎,指定块压缩器为 zstd。
默认使用英语排序规则。
创建数据库后,通常需要在其中创建集合Collections,以及存储文档Documents。
集合类似于关系数据库中的表,以下是创建集合的步骤:
1 | use xiaoyuge #指定数据库 |
注意:在MongoDB中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后,要再插入一个文档(记录),集合才会真正创建。
以下例子为myCollection
集合创建一个验证其,要求文档必须包含name和age字段,且name必须是字符串,age必须是非负整数
1 | db.createCollection("myCollection", { |
创建myCollection集合后,插入数据,如果数据不符合校验规则,则无法插入
2.2 更新集合名
在MongoDB中,不能直接通过命令来重命名集合。可以使用renameCollection()
方法来重命名集合,这个方法需要在admin
数据库命名,语法如下:
1 | db.adminCommand({ |
参数说明:
renameCollection: 要重命名的集合完全限定名称(包含数据库名)
to: 目标集合的完全限定名称(包括数据库名)
dropTarget(可选): 布尔值,如果目标集合已经存在,是否删除目标集合,默认值为false
注意事项:
权限要求: 执行
renameCollection
命令需要具有对源数据和目标数据库的适当权限,通常需要dbAdmin或者dbOwner角色目标集合不存在:目标集合不能已经存在,如果集合存在,则会返回错误
索引和数据:重命名集合会保留所有文档和索引
2.3 删除集合
删除集合的语法格式:db.collection.drop()
, drop() 方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,因此需要谨慎使用
3. 文档
文档的数据结构和JSON基本一样,所有存储在集合的的数据都是BSON格式,BSON是一种类似于JSON的二进制形式的存储格式,是Binary JSON的简称。
3.1 插入文档
常用插入文档方法包括以下几种:
方法 | 用途 |
---|---|
insertOne() | 插入单个文档 |
insertMany() | 插入多个文档 |
insertOne()
1
db.collection.insertOne(document,options)
- document: 要插入的单个文档
- options(可选): 包括
writeConcern
和bypassDocumentValidation
示例:
1
db.collection1.insertOne({"name":"张三",age: 14})
insertMany()
1
db.collection.insertMany(documents,options)
要插入的文档数组
options(可选): 包括
writeConcern
、ordered
和bypassDocumentValidation
1
2示例:
db.collection1.insertMany([{"name":"张三",age: 14}, {name: "李四",age:20}])
3.2 更新文档
在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne()
、updateMany()
、replaceOne()
和 findOneAndUpdate()
。
updateOne()
updateOne()
方法用于更新匹配过滤器的单个文档.1
db.collection.updateOne(filter,update,options)
- filter: 用于查找文档的条件
- update: 指定更新操作的文档或更新操作符
- options: 可选参数,比如upsert、arrayFilters等
1
2
3
4
5
6示例代码
db.collection1.updateOne(
{name:"张三"}, #过滤条件,找到name为张三
{$set:{age: 24}}, #更新操作,更新年龄为24
{upsert: false} #可选参数
)
updateMany()
1
db.collection.updateMany(filter, update, options)
- filter: 用于查找文档的条件
- update: 指定更新操作的文档或更新操作符
- options: 可选参数,比如upsert、arrayFilters等
1
2
3
4
5db.collection1.updateMany(
{ age: { $lt: 20 } }, // 过滤条件
{ $set: { status: "active" } }, // 更新操作
{ upsert: false } // 可选参数
);replaceOne()
replaceOne() 方法用于替换匹配过滤器的单个文档,新的文档将完全替换旧的文档
1
db.collection.replaceOne(filter, replacement, options)
- filter:用于查找文档的查询条件。
- replacement:新的文档,将替换旧的文档。
- options:可选参数对象,如 upsert 等。
1
2
3
4
5
6示例代码
db.collection1.replaceOne(
{name:"张三"}, #过滤条件
{name:"张三",age: 18}, #新文档
{ returnDocument: "after" } #替换并更新
)findOneAndUpdate()
findOneAndUpdate() 方法用于查找并更新单个文档,可以选择返回更新前或更新后的文档。
1
db.collection.findOneAndUpdate(filter, update, options)
filter:用于查找文档的查询条件。
update:指定更新操作的文档或更新操作符。
options:可选参数对象,如 projection、sort、upsert、returnDocument 等。
- upsert:如果没有匹配的文档,是否插入一个新文档。
- arrayFilters:当更新嵌套数组时,指定应更新的数组元素的条件。
- collation:指定比较字符串时使用的排序规则。
- returnDocument:在 findOneAndUpdate 中使用,指定返回更新前 (“before”) 或更新后 (“after”) 的文档。
1
2
3
4
5db.collection1.findOneAndUpdate(
{ name: "张三" }, // 过滤条件
{ $set: { age: 36 } }, // 更新操作
{ returnDocument: "after" } // 可选参数,返回更新后的文档
);
其他实例:
1 | 只更新第一条记录: |
3.2 删除文档
常用的删除文档方法包括 deleteOne()、deleteMany() 以及 findOneAndDelete()。
使用场景:
数据清理:删除不再需要的旧数据或无效数据。
数据修正:在数据修正过程中删除错误的或重复的文档。
自动化任务:在自动化脚本或任务中,根据特定条件删除文档。
- 删除单个文档deleteOne()
1
db.collection.deleteOne(filter, options)
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。
- 删除多个文档deleteMany()
1
db.collection.deleteMany(filter, options)
- filter:用于查找要删除的文档的查询条件。
- options(可选):一个可选参数对象。