【Mongodb专题】之常用命令

1. 数据库

1.1 创建数据库

MongoDB默认的数据库为test,如果没有创建新的数据库,集合将存放在test数据库中。

当通过shell连接MongoDB实例是,如果没有使用use 命令切换到其他数据库,则会默认使test数据库

首次向MongoDB中插入数据时,如果数据库不存在,MongoDB会自动创建它,只需要选择一个数据库名称,并开始向其插入文档即可

1
2
3
4
use databaseName #如果xiaoyuge数据库不存在,则会创建一个xiaoyuge数据库
db #显式当前数据库名称
show dbs #显示所有数据库,如果是刚创建的则不会显示,需要插入文档后才会显示
db.xiaoyuge.insertOne({"age","18"}) #插入文档

数据库的创建是自动的,不需要显式的创建,除非需要在创建是指定特定的配置选项,只有在数据库至少有一个集合时,数据库才会在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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
db.createCollection("myComplexCollection", {
capped: true,
size: 10485760,
max: 5000,
validator: { $jsonSchema: {
bsonType: "object",
required: ["name", "email"],
properties: {
name: {
bsonType: "string",
description: "必须为字符串且为必填项"
},
email: {
bsonType: "string",
pattern: "^.+@.+$",
description: "必须为有效的电子邮件地址"
}
}
}},
validationLevel: "strict",
validationAction: "error",
storageEngine: {
wiredTiger: { configString: "block_compressor=zstd" }
},
collation: { locale: "en", strength: 2 }
});

这个例子创建了一个集合,具有以下特性:

  • 固定大小,最大 10MB,最多存储 5000 个文档。

  • 文档必须包含 name 和 email 字段,其中 name 必须是字符串,email 必须是有效的电子邮件格式。

  • 验证级别为严格,验证失败将阻止插入或更新。

  • 使用 WiredTiger 存储引擎,指定块压缩器为 zstd。

  • 默认使用英语排序规则。

创建数据库后,通常需要在其中创建集合Collections,以及存储文档Documents。

集合类似于关系数据库中的表,以下是创建集合的步骤:

1
2
use xiaoyuge      #指定数据库
db.createCollection("myCollection") #创建集合

注意:在MongoDB中,集合只有在内容插入后才会创建,就是说,创建集合(数据表)后,要再插入一个文档(记录),集合才会真正创建。

以下例子为myCollection集合创建一个验证其,要求文档必须包含name和age字段,且name必须是字符串,age必须是非负整数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
db.createCollection("myCollection", {
validator: { $jsonSchema: {
bsonType: "object",
required: ["name", "age"],
properties: {
name: {
bsonType: "string",
description: "必须为字符串且为必填项"
},
age: {
bsonType: "int",
minimum: 0,
description: "必须为整数且为必填项"
}
}
}}
});

创建myCollection集合后,插入数据,如果数据不符合校验规则,则无法插入

2.2 更新集合名

在MongoDB中,不能直接通过命令来重命名集合。可以使用renameCollection()方法来重命名集合,这个方法需要在admin数据库命名,语法如下:

1
2
3
4
5
db.adminCommand({
renameCollection: "sourceDb.sourceCollection",
to: "targetDb.targetCollection",
dropTarget: <boolean>
})

参数说明:

  • renameCollection: 要重命名的集合完全限定名称(包含数据库名)

  • to: 目标集合的完全限定名称(包括数据库名)

  • dropTarget(可选): 布尔值,如果目标集合已经存在,是否删除目标集合,默认值为false

注意事项:

  • 权限要求: 执行renameCollection命令需要具有对源数据和目标数据库的适当权限,通常需要dbAdmin或者dbOwner角色

  • 目标集合不存在:目标集合不能已经存在,如果集合存在,则会返回错误

  • 索引和数据:重命名集合会保留所有文档和索引

2.3 删除集合

删除集合的语法格式:db.collection.drop(), drop() 方法可以永久地从数据库中删除指定的集合及其所有文档,这是一个不可逆的操作,因此需要谨慎使用

3. 文档

文档的数据结构和JSON基本一样,所有存储在集合的的数据都是BSON格式,BSON是一种类似于JSON的二进制形式的存储格式,是Binary JSON的简称。

3.1 插入文档

常用插入文档方法包括以下几种:

方法 用途
insertOne() 插入单个文档
insertMany() 插入多个文档
  1. insertOne()

    1
    db.collection.insertOne(document,options)
    • document: 要插入的单个文档
    • options(可选): 包括writeConcernbypassDocumentValidation

    示例:

    1
    db.collection1.insertOne({"name":"张三",age: 14})
  1. insertMany()

    1
    db.collection.insertMany(documents,options)
    • 要插入的文档数组

    • options(可选): 包括writeConcernorderedbypassDocumentValidation

    1
    2
    #示例:
    db.collection1.insertMany([{"name":"张三",age: 14}, {name: "李四",age:20}])

3.2 更新文档

在 MongoDB 中,更新文档的操作可以使用多种方法实现,常用的方法包括 updateOne()updateMany()replaceOne() findOneAndUpdate()

  1. 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} #可选参数
    )
  1. updateMany()

    1
    db.collection.updateMany(filter, update, options)
    • filter: 用于查找文档的条件
    • update: 指定更新操作的文档或更新操作符
    • options: 可选参数,比如upsert、arrayFilters等
    1
    2
    3
    4
    5
    db.collection1.updateMany(
    { age: { $lt: 20 } }, // 过滤条件
    { $set: { status: "active" } }, // 更新操作
    { upsert: false } // 可选参数
    );
  2. 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" } #替换并更新
    )
  3. 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
    5
    db.collection1.findOneAndUpdate(
    { name: "张三" }, // 过滤条件
    { $set: { age: 36 } }, // 更新操作
    { returnDocument: "after" } // 可选参数,返回更新后的文档
    );

其他实例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#只更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

#全部更新
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

#只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

#全部添加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

#全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

#只更新第一条记录:
db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

3.2 删除文档

常用的删除文档方法包括 deleteOne()、deleteMany() 以及 findOneAndDelete()。

使用场景:

  • 数据清理:删除不再需要的旧数据或无效数据。

  • 数据修正:在数据修正过程中删除错误的或重复的文档。

  • 自动化任务:在自动化脚本或任务中,根据特定条件删除文档。

  1. 删除单个文档deleteOne()
    1
    db.collection.deleteOne(filter, options)
    • filter:用于查找要删除的文档的查询条件。
    • options(可选):一个可选参数对象。
  2. 删除多个文档deleteMany()
    1
    db.collection.deleteMany(filter, options)
    • filter:用于查找要删除的文档的查询条件。
    • options(可选):一个可选参数对象。