MongoDB(二) - MongoDB命令详解

文章目录

  • 前言
  • 一、数据库操作
    • [1. 切换/创建数据库](#1. 切换/创建数据库)
    • [2. 查看数据库](#2. 查看数据库)
      • [2.1 查看所有数据库](#2.1 查看所有数据库)
      • [2.2 查看当前数据库](#2.2 查看当前数据库)
    • [3. 删除数据库](#3. 删除数据库)
  • 二、集合操作
    • [1. 创建集合](#1. 创建集合)
    • [2. 查看集合](#2. 查看集合)
    • [3. 删除集合](#3. 删除集合)
  • 三、文档操作
    • [1. 插入文档](#1. 插入文档)
      • [1.1 单文档插入](#1.1 单文档插入)
      • [1.2 多文档插入](#1.2 多文档插入)
    • [2. 更新文档](#2. 更新文档)
      • [2.1 单文档更新](#2.1 单文档更新)
      • [2.2 多文档更新](#2.2 多文档更新)
    • [3. 删除文档](#3. 删除文档)
      • [3.1 单文档删除](#3.1 单文档删除)
      • [3.2 多文档删除](#3.2 多文档删除)
  • [四. 查询文档](#四. 查询文档)
    • [1. 基本查询](#1. 基本查询)
    • [2. 条件查询](#2. 条件查询)
    • [3. 数组查询](#3. 数组查询)
    • [4. 投影](#4. 投影)
    • [5. 其他查询](#5. 其他查询)
      • [5.1 查询第一个匹配的文档](#5.1 查询第一个匹配的文档)
      • [5.2 限制返回文档的数量](#5.2 限制返回文档的数量)
      • [5.3 跳过指定数量的文档](#5.3 跳过指定数量的文档)
      • [5.4 排序查询](#5.4 排序查询)
      • [5.5 嵌套文档查询](#5.5 嵌套文档查询)
      • [5.6 正则表达式查询](#5.6 正则表达式查询)
    • [6. 聚合操作](#6. 聚合操作)
      • [6.1 聚合操作符](#6.1 聚合操作符)
      • [6.2 聚合操作示例](#6.2 聚合操作示例)
      • [6.3 Map-Reduce操作](#6.3 Map-Reduce操作)
        • [6.3.1 MongoDB中Map-Reduce操作介绍](#6.3.1 MongoDB中Map-Reduce操作介绍)
        • [6.3.2 Map-Reduce操作示例](#6.3.2 Map-Reduce操作示例)
  • 五、索引操作
    • [1. MongoDB索引介绍](#1. MongoDB索引介绍)
    • [2. MongoDB索引类型](#2. MongoDB索引类型)
    • [3. 创建索引](#3. 创建索引)
    • [4. 查看索引](#4. 查看索引)
    • [5. 删除索引](#5. 删除索引)
      • [5.1 删除单个索引](#5.1 删除单个索引)
      • [5.2 删除多个索引](#5.2 删除多个索引)
  • 六、用户和权限管理
    • [1. 内置角色及相关权限](#1. 内置角色及相关权限)
    • [2. 创建用户](#2. 创建用户)
    • [3. 查看用户](#3. 查看用户)
    • [4. 修改用户](#4. 修改用户)
      • [4.1 修改用户信息](#4.1 修改用户信息)
      • [4.2 修改用户密码](#4.2 修改用户密码)
      • [4.3 修改用户角色](#4.3 修改用户角色)
        • [4.3.1 添加用户角色](#4.3.1 添加用户角色)
        • [4.3.2 撤销用户角色](#4.3.2 撤销用户角色)
    • [5. 删除用户](#5. 删除用户)
  • 七、帮助信息命令
    • [1. 查看命令帮助信息](#1. 查看命令帮助信息)
    • [2. 查看数据库帮助信息](#2. 查看数据库帮助信息)
    • [3. 查看集合帮助信息](#3. 查看集合帮助信息)

前言

本文是 MongoDB 的操作指南,全面介绍了其在数据库、集合、文档、索引、用户权限管理等方面的操作。开篇点明 MongoDB 在数据管理领域的重要性,随后详细阐述各项操作。数据库操作涵盖切换、创建、查看和删除数据库;集合操作包括创建、查看和删除集合;文档操作涉及插入、更新、删除和查询,查询又分为基本查询、条件查询、数组查询等多种方式,并介绍了聚合操作和 Map - Reduce 操作。索引操作讲解了索引类型、创建、查看和删除方法。用户权限管理介绍了内置角色和权限,以及用户的创建、查看、修改和删除操作。此外,还介绍了帮助信息命令。本文旨在帮助读者系统掌握 MongoDB 操作,为实际应用提供有力支持。


一、数据库操作

1. 切换/创建数据库

使用use命令切换/创建数据库的语法如下:

cmd 复制代码
use <database_name>

示例 :切换到名为 db_demo1 的数据库。如果该数据库不存在,MongoDB 不会在执行这条命令时创建它,但当你第一次存储数据(如插入文档)时,MongoDB 会自动创建这个数据库。

cmd 复制代码
use db_demo1

2. 查看数据库

2.1 查看所有数据库

cmd 复制代码
show dbs

执行结果如下图所示:

发现没有创建的数据库db_demo1,是因为使用use命令创建的数据库中如果没有任何数据,没有数据的数据库可以理解为实际不存在

2.2 查看当前数据库

cmd 复制代码
db

3. 删除数据库

可以使用如下命令删除当前数据库。

cmd 复制代码
db.dropDatabase()

删除当前数据库实际上只是把数据库中的数据清空,因为执行删除数据库命令后,再执行查看当前数据库的命令,依然显示当前数据库为删除之前的数据库。

cmd 复制代码
db
db.dropDatabase()
db

二、集合操作

1. 创建集合

创建集合语法如下:

shell 复制代码
db.createCollection(<collection_name>)

创建集合c_demo1

shell 复制代码
db.createCollection('c_demo1')

2. 查看集合

查看当前数据库中的所有集合。

shell 复制代码
show collections

执行结果如下图所示:

3. 删除集合

删除集合语法如下:

shell 复制代码
db.<collection_name>.drop()

删除当前数据库中的集合c_demo1

shell 复制代码
db.c_demo1.drop()

执行结果如下图所示:


三、文档操作

1. 插入文档

1.1 单文档插入

单文档插入语法如下:

shell 复制代码
db.<collection_name>.insertOne(
   <document>,
   {
     writeConcern: <document>,
     ordered: <boolean>
   }
)
  • <document>:要插入的文档,是一个 JSON 对象。
  • writeConcern:可选参数,指定写入操作的确认级别,用于控制写入操作在复制集成员中的传播和确认方式。
  • ordered:可选参数,在批量插入时才会用到,对于 insertOne 无实际意义。

示例 :切换到名为 db_demo2 的数据库。如果该数据库不存在,MongoDB 不会在执行这条命令时创建它,但当你第一次存储数据(如插入文档)时,MongoDB 会自动创建这个数据库。向集合c_demo2 中插入一个新文档。

shell 复制代码
use db_demo2;
db.c_demo2.insertOne({
    name: "John",
    age: 30,
    city: "New York"
});

执行结果如下图所示:

1.2 多文档插入

多文档插入语法如下:

shell 复制代码
db.<collection_name>.insertMany(
   [ <document 1>, <document 2>, ... ],
   {
     writeConcern: <document>,
     ordered: <boolean>
   }
)

示例1 :向集合c_demo2 中插入两个新文档。

shell 复制代码
db.c_demo2.insertMany([
    { name: "Alice", age: 25, city: "Los Angeles" },
    { name: "Bob", age: 35, city: "Chicago" }
]);

执行结果如下图所示:

示例2 :向集合c_demo3 中插入嵌套文档或数组。

shell 复制代码
db.c_demo3.insertMany([
    { name: "zhangsan", info: { age: 30, address: "yunnan", hight: 176 } },
    { name: "lisi", info: { age: 31, address: "guizhou", hight: 175 } },
    { name: "wangwu", scores: [80, 90, 75] }
]);

执行结果如下图所示:

2. 更新文档

2.1 单文档更新

更新语法如下:

shell 复制代码
db.<collection_name>.updateOne(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string> 
   }
)
  • <filter>:用于筛选出需要更新的文档,类似于 SQL 中的 WHERE 子句。
  • <update>:指定更新操作,可使用更新操作符(如 s e t 、 set、 set、inc 等)来修改文档的字段。
    • $set:用于设置文档中指定字段的值。如果该字段不存在,则会创建该字段;如果字段已存在,则会更新其值。
    • $inc:用于对文档中指定的数字字段进行增量操作,即增加或减少该字段的值。该字段必须是数字类型,否则会报错。
    • $unset:用于从文档中删除指定的字段。
    • $push:用于向数组字段中添加一个元素。如果数组字段不存在,则会创建该数组字段并添加元素。
    • $pull:用于从数组字段中移除所有匹配指定值的元素。
    • $addToSet:用于向数组字段中添加一个元素,但只有当该元素不在数组中时才会添加,避免数组中出现重复元素。
  • upsert:可选参数,布尔值。如果设置为 true,当没有匹配的文档时,会插入一个新文档;默认值为 false。
  • writeConcern:可选参数,指定写入操作的确认级别。
  • collation:可选参数,指定用于操作的排序规则。
  • arrayFilters:可选参数,用于过滤数组元素。
  • hint:可选参数,指定使用哪个索引进行查询

示例 :将c_demo2文档中nameAlice的学生的age更新为26

shell 复制代码
db.c_demo2.updateOne(
  { "name": "Alice" },
  { $set: { "age": 26 } }
);

执行结果如下图所示:

2.2 多文档更新

多文档更新语法如下:

shell 复制代码
db.<collection_name>.updateMany(
   <filter>,
   <update>,
   {
     upsert: <boolean>,
     writeConcern: <document>,
     collation: <document>,
     arrayFilters: [ <filterdocument1>, ... ],
     hint:  <document|string> 
   }
)

示例 :将所有 age 大于 20 的数据的name 设置为 new_name。

shell 复制代码
db.c_demo2.updateMany(
  { "age": { $gt: 20 } },
  { $set: { "name": "new_name" } }
);

执行结果如下图所示:

3. 删除文档

3.1 单文档删除

删除集合中第一个匹配指定条件的文档。如果有多个文档满足条件,只会删除其中一个。

单文档删除语法如下:

shell 复制代码
db.<collection_name>.deleteOne(
   <filter>,
   {
     writeConcern: <document>
   }
)

示例 :删除集合c_demo2namenew_name的第一个文档。

shell 复制代码
db.c_demo2.deleteOne({ "name": "new_name" });

执行结果如下图所示:

3.2 多文档删除

删除集合中所有匹配指定条件的文档。

多文档删除语法如下:

shell 复制代码
db.<collection_name>.deleteMany(
   <filter>,
   {
     writeConcern: <document>
   }
)

示例 :删除集合c_demo2age大于 30 的所有文档。

shell 复制代码
db.c_demo2.deleteMany({ "age": { $gt: 30 } });

执行结果如下图所示:


四. 查询文档

1. 基本查询

基本查询是最基础的查询方式,通过指定文档的字段和值来筛选文档。

查询语法如下:

shell 复制代码
db.<collection_name>.find(<query>, <projection>)

shell 复制代码
db.<collection_name>.find(<query>, <projection>).pretty()
  • <query>:一个文档对象,用于指定查询条件。
  • <projection>:可选参数,用于指定返回文档中要包含或排除的字段。
  • pretty():用于美化查询结果。

示例1 :查询集合c_demo2age等于 30 的所有文档。

shell 复制代码
db.c_demo2.find({ "age": 30 });

执行结果如下图所示:

示例2 :查询集合c_demo2中的所有文档。

shell 复制代码
db.c_demo2.find({});

执行结果如下图所示:

2. 条件查询

MongoDB 条件查询操作符的介绍如下:

操作符 描述 示例
$eq 匹配等于指定值的文档。 {age: {$eq: 28}} 将匹配 age 字段值为 28 的所有文档。
$ne 匹配不等于指定值的文档。 {age: {$ne: 28}} 将匹配 age 字段值不是 28 的所有文档。
$gt 匹配大于指定值的文档。 {age: {$gt: 28}} 将匹配 age 字段值大于 28 的所有文档。
$gte 匹配大于或等于指定值的文档。 {age: {$gte: 28}} 将匹配 age 字段值大于或等于 28 的所有文档。
$lt 匹配小于指定值的文档。 {age: {$lt: 28}} 将匹配 age 字段值小于 28 的所有文档。
$lte 匹配小于或等于指定值的文档。 {age: {$lte: 28}} 将匹配 age 字段值小于或等于 28 的所有文档。
$in 匹配字段值在指定数组内的文档。 {age: {$in: [20, 25, 30]}} 将匹配 age 字段值为 20、25 或 30 的所有文档。
$nin 匹配字段值不在指定数组内的文档。 {age: {$nin: [20, 25, 30]}} 将匹配 age 字段值不是 20、25 或 30 的所有文档。
$and 匹配满足所有条件的文档。 {$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]} 将匹配 age 字段值大于 20 并且小于 30 的所有文档。
$or 匹配满足任一条件的文档。 {$or: [{age: 20}, {age: 30}]} 将匹配 age 字段值为 20 或者 30 的所有文档。
$not 匹配不符合条件的文档。这是一个用于逻辑否定的操作符。 {age: {$not: {$gt: 25}}} 将匹配 age 字段值不大于 25 的所有文档。
$nor 匹配不满足任何给定条件的文档。 {$nor: [{age: 20}, {age: 30}]} 将匹配 age 字段值既不是 20 也不是 30 的所有文档。

示例1 :查询集合c_demo2age大于等于 25 的所有文档。

shell 复制代码
db.c_demo2.find({ "age": { $gte: 25 } });

执行结果如下图所示:

示例2 :查询集合c_demo2age大于 22 且小于 30 的所有文档。

shell 复制代码
db.c_demo2.find({$and: [{age: {$gt: 20}}, {age: {$lt: 30}}]});

执行结果如下图所示:

3. 数组查询

当文档中包含数组字段时,可以使用特定的操作符进行数组查询,如 $elemMatch$size

示例1 :查询集合c_demo3scores 数组中至少有一个元素大于 85 的文档。

shell 复制代码
db.c_demo3.find({ "scores": { $elemMatch: { $gt: 85 } } });

执行结果如下图所示:

示例2 :查询集合c_demo3scores 数组长度为 3 的文档。

shell 复制代码
db.c_demo3.find({ "scores": { $size: 3 } });

执行结果如下图所示:

4. 投影

投影用于指定返回文档中要包含或排除的字段,默认情况下,_id 字段会被返回。

示例1包含指定字段 :查询集合c_demo2namecity 字段,排除 _id 字段。

shell 复制代码
db.c_demo2.find({}, { "name": 1, "city": 1, "_id": 0 });

执行结果如下图所示:

示例2排除指定字段 :排除 _idname 字段。

shell 复制代码
db.c_demo2.find({}, { "_id": 0, "name": 0 });

执行结果如下图所示:

5. 其他查询

5.1 查询第一个匹配的文档

findOne():返回第一个匹配的文档,而不是所有匹配的文档。

shell 复制代码
db.c_demo2.findOne({ "name": "new_name" });

执行结果如下图所示:

5.2 限制返回文档的数量

查询集合c_demo2的前两个文档。

shell 复制代码
db.c_demo2.find().limit(2);

执行结果如下图所示:

5.3 跳过指定数量的文档

查询集合c_demo2中跳过前3个文档的所有文档。

shell 复制代码
db.c_demo2.find().skip(3);

执行结果如下图所示:

5.4 排序查询

sort():对查询结果进行排序,1 表示升序,-1 表示降序。

查询集合c_demo2中的所有文档,并按age进行升序排序。

shell 复制代码
db.c_demo2.find({}, { "_id": 0 }).sort({ "age": 1 });

执行结果如下图所示:

5.5 嵌套文档查询

示例1 :查询集合c_demo3namezhangsan,且嵌套文档infoage为 30 和addressyunnan的第一个匹配的文档。

shell 复制代码
db.c_demo3.findOne({ "name": "zhangsan", "info.age": 30, "info.address": "yunnan" });

执行结果如下图所示:

5.6 正则表达式查询

示例1 :查询集合c_demo2city的值以Los开头的所有文档。

shell 复制代码
db.c_demo2.find({ "city": /^Los/ });

执行结果如下图所示:

6. 聚合操作

6.1 聚合操作符

MongoDB 中常用的聚合操作符如下:

操作符 描述
$group 按指定字段分组,并可以执行聚合表达式来计算汇总值。
$limit 限制传递给下一个阶段的文档数量。
$match 过滤通过的文档,只传递符合指定条件的文档到下一个阶段。
$sort 对输入文档按指定字段排序。
$project 修改文档结构,包括重命名、增加或移除字段等。
$skip 忽略指定数量的文档。
$sum 计算数值字段的总和。
$avg 计算数值字段的平均值。
$min 找出数值字段的最小值。
$max 找出数值字段的最大值。
$push 将数组字段中的元素添加到输出文档中。
$first 返回数组中的第一个元素。
$last 返回数组中的最后一个元素。

6.2 聚合操作示例

在当前数据库中给集合c_demo4插入多个文档,用于演示聚合操作。

shell 复制代码
db.c_demo4.insertMany([
    { _id: 1, category: "A", value: 10 },
    { _id: 2, category: "B", value: 20 },
    { _id: 3, category: "A", value: 30 },
    { _id: 4, category: "B", value: 40 },
    { _id: 5, category: "C", value: 50 },
	{ _id: 6, category: "A", value: 10 },
    { _id: 7, category: "B", value: 20 },
    { _id: 8, category: "A", value: 30 },
    { _id: 9, category: "B", value: 40 },
    { _id: 10, category: "C", value: 50 }
])

执行结果如下图所示:

示例 1 : 使用 $group 计算每个类别的总和,_id 用于指定分组字段

javascript 复制代码
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            totalValue: { $sum: "$value" }
        }
    }
])

执行结果如下图所示:

示例 2 : 使用 $match 过滤特定类别的文档。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $match: { category: "A" }
    }
])

执行结果如下图所示:

示例 3 : 使用 $sort 对文档排序。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $sort: { value: -1 }
    }
])

执行结果如下图所示:

示例 4 : 使用 $project 修改文档结构。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $project: {
            _id: 0,
            category: 1,
            value: 1
        }
    }
])

执行结果如下图所示:

示例 5 : 使用 $skip$limit 分页查询。

javascript 复制代码
db.c_demo4.aggregate([
    { $skip: 2 },
    { $limit: 2 }
])

执行结果如下图所示:

示例 6 : 使用 $avg 计算平均值,_id 为 null 表示不分组,即把整个集合视为一个单一的组。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $group: {
            _id: null,
            averageValue: { $avg: "$value" }
        }
    }
])

执行结果如下图所示:

示例 7 : 使用 $min$max 找出最小值和最大值。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $group: {
            _id: null,
            minValue: { $min: "$value" },
            maxValue: { $max: "$value" }
        }
    }
])

执行结果如下图所示:

示例 8 : 使用 $push 收集数组中的元素。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            values: { $push: "$value" }
        }
    }
])

执行结果如下图所示:

示例 9 : 使用 $first$last 返回数组中的第一个和最后一个元素。

javascript 复制代码
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            firstValue: { $first: "$value" },
            lastValue: { $last: "$value" }
        }
    }
])

执行结果如下图所示:

6.3 Map-Reduce操作

MongoDB使用Map-Reduce来处理复杂的数据分析任务。

6.3.1 MongoDB中Map-Reduce操作介绍

Map-Reduce在MongoDB中是一种用于处理和聚合数据的强大工具,尤其适用于需要对大量数据进行复杂分析的场景。下面是对MongoDB中Map-Reduce操作语法的介绍。

基本概念

  1. Map函数 :负责处理输入文档,并为每个输入文档调用一次emit(key, value)函数生成键值对。
  2. Reduce函数:接收Map阶段输出的一个键和该键对应的值列表,并将这些值归约为一个单一的输出值。
  3. Finalize函数(可选):在所有Map和Reduce操作完成后,可以使用此函数对结果进行最后的修改或格式化。

Map-Reduce操作语法结构如下

javascript 复制代码
db.<collection_name>.mapReduce(
    function() { /* map function */ },
    function(key, values) { /* reduce function */ },
    {
        out: /* 输出选项 */,
        query: /* 可选:过滤条件 */,
        sort: /* 可选:排序 */,
        limit: /* 可选:限制返回的文档数 */,
        finalize: /* 可选:finalize函数 */,
        scope: /* 可选:定义全局变量 */,
        jsMode: /* 可选:优化内存使用 */,
        verbose: /* 可选:是否输出详细信息 */
    }
);

参数说明

  • map :必需,指定Map函数。这个函数会遍历每个文档,并调用emit(key, value)产生键值对。
  • reduce:必需,指定Reduce函数。这个函数接收Map阶段产生的键和对应的值数组,并将其归约为单个值。
  • out :必需,指定Map-Reduce操作的结果如何输出。可以是:
    • {inline: 1}:结果直接返回,适用于小数据集。
    • "collectionName":结果存储在一个指定的集合中。
    • {"replace": "collectionName"}{"merge": "collectionName"}{"reduce": "collectionName"}:分别表示替换、合并、减少到指定集合。
  • query:可选,用于筛选输入文档的条件。
  • sort:可选,用于对输入文档进行排序。
  • limit:可选,限制传递给Map函数的文档数量。
  • finalize:可选,最终处理函数,在所有Map和Reduce操作完成后应用。
  • scope:可选,可以在JavaScript函数中使用的全局变量。
  • jsMode:可选,通过尽量减少BSON和JS之间的转换来提高性能。
  • verbose:可选,设置为true时,提供详细的执行统计信息。

注意事项

  • Map和Reduce函数必须是纯函数,即相同的输入总是产生相同的输出。
  • Reduce函数的输出格式应该与Map函数的emit格式兼容,以便于可能的多次归约。
  • 对于较大的数据集,考虑使用Aggregation Pipeline作为替代方案,因为它通常更高效且易于使用。
6.3.2 Map-Reduce操作示例

在当前数据库中给集合orders插入多个文档,用于演示Map-Reduce操作。

javascript 复制代码
db.orders.insertMany([
    { "_id" : 1, "customer" : "Alice", "amount" : 50 },
    { "_id" : 2, "customer" : "Bob", "amount" : 100 },
    { "_id" : 3, "customer" : "Alice", "amount" : 75 },
    { "_id" : 4, "customer" : "Charlie", "amount" : 150 },
    { "_id" : 5, "customer" : "Bob", "amount" : 200 }
]);

执行结果如下图所示:

示例

定义Map函数 :这个函数会遍历每个文档,并为每个客户发出一个键值对,其中键是客户名,值是订单金额。
定义Reduce函数 :这个函数接收Map阶段输出的键和对应的值列表,并计算总和。
执行Map-Reduce :使用上面定义的Map和Reduce函数执行Map-Reduce操作,并将结果存储在一个新的集合order_totals中。

javascript 复制代码
db.orders.mapReduce(
    function() { emit(this.customer, this.amount); },
    function(key, values) { return Array.sum(values); },
    {
        out: "order_totals"
    }
);

执行结果如下图所示:

查看结果 :执行完上述操作后,可以通过查询新集合order_totals来查看每个客户的订单总额。

javascript 复制代码
db.order_totals.find();

执行结果如下图所示:


五、索引操作

1. MongoDB索引介绍

MongoDB中的索引是为了提高查询性能而设计的数据结构。通过为集合中的一个或多个字段创建索引,可以显著加快查询速度。然而,值得注意的是,虽然索引加速了读取操作,但它们也增加了写入操作(如插入和更新)的成本,并占用额外的存储空间。

2. MongoDB索引类型

MongoDB支持多种类型的索引,以满足不同的需求:

  • 单字段索引:在单个字段上创建的索引。
  • 复合索引:包含多个字段的索引。
  • 多键索引:用于数组字段上的索引。
  • 文本索引:支持对字符串内容进行全文搜索。
  • 地理空间索引 :包括2dsphere2d索引,支持基于地理位置的数据查询。
  • 哈希索引:主要用于支持分片键的哈希分片。

3. 创建索引

创建索引语法如下:

javascript 复制代码
db.<collection_name>.createIndex( keys, options );
  • keys:指定要索引的一个或多个字段以及每个字段的索引类型(1表示升序,-1表示降序)。对于复合索引,你可以传递一个包含多个键值对的对象。
  • options:(可选)一个文档,用于指定索引的行为和属性,如唯一性、背景构建等。

创建示例数据 :下面以一个名为students的集合为例,演示如何创建索引。首先,创建一些示例数据:

javascript 复制代码
use db_school;

db.students.insertMany([
    { name: "Alice", age: 20, scores: [85, 90], address: { city: "Beijing" } },
    { name: "Bob", age: 22, scores: [70, 75], address: { city: "Shanghai" } },
    { name: "Charlie", age: 21, scores: [90, 88], address: { city: "Guangzhou" } }
]);

执行结果如下图所示:

示例1 :为name字段创建一个升序索引。

javascript 复制代码
db.students.createIndex({ name: 1 });

执行结果如下图所示:

  • "numIndexesBefore": 1 :这表示在创建新索引之前,集合中已经存在的索引数量。由于MongoDB默认会在_id字段上自动创建一个索引,所以这里显示的是1。

  • "numIndexesAfter": 2 :这表明在成功创建新索引之后,集合中现在总共有的索引数量。因为刚刚为name字段创建了一个新的升序索引,所以索引总数从1增加到了2。

  • "createdCollectionAutomatically": false :这个字段指示是否因为创建索引而自动创建了集合。在这个例子中,值为false,意味着集合students在执行此操作之前已经存在,并非因创建索引而自动创建的。

  • "ok": 1 :这是一个状态标识符,表明操作成功完成。如果出现错误,这个字段的值会是0,并且通常会有额外的错误信息来描述问题所在。

示例2 :在agescores字段上创建一个复合索引。

javascript 复制代码
db.students.createIndex({ age: 1, scores: -1 });

执行结果如下图所示:

4. 查看索引

查看索引语法如下:

javascript 复制代码
db.<collection_name>.getIndexes();

示例 :查看students集合中已经存在的索引。

javascript 复制代码
db.students.getIndexes();

执行结果如下图所示:

5. 删除索引

5.1 删除单个索引

删除单个索引语法如下:

javascript 复制代码
db.<collection_name>.dropIndex(
    <index>,
    {
        writeConcern: <document>
    }
);
  • <index>:可以是索引的名称(字符串类型),也可以是索引的键模式(文档类型)。索引名通常是 MongoDB 自动生成的,例如 { field1: 1, field2: -1 } 索引的默认名称可能是 field1_1_field2_-1。
  • writeConcern:可选参数,指定写入操作的确认级别,用于控制写入操作在复制集成员中的传播和确认方式。

示例1 :删除名为name_1的索引。

javascript 复制代码
db.students.dropIndex("name_1");

执行结果如下图所示:

  • "nIndexesWas": 3:这表示在执行删除操作之前,集合中总共有3个索引。
  • "ok": 1:这是一个状态标识符,表明操作成功完成。

示例2 :删除为agescores字段创建的复合索引。

javascript 复制代码
db.students.dropIndex({ age: 1, scores: -1 });

执行结果如下图所示:

5.2 删除多个索引

删除多个索引语法如下:

javascript 复制代码
db.<collection_name>.dropIndexes(
    <indexes>,
    {
        writeConcern: <document>
    }
);

示例1 :删除除 _id 索引之外的所有索引。

javascript 复制代码
db.students.dropIndexes();

javascript 复制代码
db.students.dropIndexes("*");

示例2

分别为nameage字段创建升序索引。

javascript 复制代码
db.students.createIndex({ name: 1 });
db.students.createIndex({ age: 1 });

根据索引名称删除nameage字段的升序索引。

javascript 复制代码
db.students.dropIndexes(["age_1", "name_1"]);

执行结果如下图所示:


六、用户和权限管理

1. 内置角色及相关权限

MongoDB内置了多种角色,用于提供不同层次和类型的权限管理。

以下概述了一些常用的内置角色及其描述:

角色名称 描述
read 允许用户读取指定数据库中的所有非系统集合的数据。
readWrite 包括read角色的所有权限,并允许在所有非系统集合上进行插入、更新和删除操作。
dbAdmin 提供执行管理任务的能力,如模式管理(索引创建和删除)、统计信息收集等,但不包括用户和角色管理。
userAdmin 允许管理当前数据库的用户和角色,包括创建用户、修改密码以及分配角色。拥有此角色的用户可以赋予自己任何权限。
clusterAdmin 提供最高的集群管理操作权限,包括添加和移除节点、查看集群状态等。它包含其他集群管理角色,如clusterManagerclusterMonitorhostManager
readAnyDatabase 类似于read角色,但是作用范围扩展到了所有的数据库(除了localconfig)。需要在admin数据库中授予。
readWriteAnyDatabase 类似于readWrite角色,但是作用范围扩展到了所有的数据库(除了localconfig)。需要在admin数据库中授予。
userAdminAnyDatabase 类似于userAdmin角色,但是作用范围扩展到了所有的数据库。允许管理所有数据库中的用户和角色。需要在admin数据库中授予。
dbAdminAnyDatabase 类似于dbAdmin角色,但是作用范围扩展到了所有的数据库。需要在admin数据库中授予。
root 超级用户角色,拥有对整个系统的完全控制权,包括对所有资源的访问权限。仅适用于admin数据库。

2. 创建用户

创建用户语法如下:

shell 复制代码
db.createUser(
    {
        user: "<username>",
        pwd:  "<password>",
        customData: { <any information> },
        roles: [
           { role: "<role>", db: "<database>" } | "<role>",
           ...
        ],
        mechanisms: [ "<SCRAM-SHA-1>" | "<SCRAM-SHA-256>", ... ],
        passwordDigestor: "<server|client>"
    }
)
  • user:指定要创建的用户名,是一个字符串类型。
  • pwd:指定用户的密码,可以是字符串或 PasswordPrompt() 函数(用于交互式输入密码)。
  • customData:可选参数,用于存储与用户相关的自定义数据,是一个文档对象。
  • roles:指定用户被授予的角色,可以是一个角色数组。每个角色可以是一个文档对象 { role: "", db: "" },表示在指定数据库上的角色;也可以是一个简单的角色名称字符串。
  • mechanisms:可选参数,指定认证机制,如 "SCRAM-SHA-1" 或 "SCRAM-SHA-256"。
  • passwordDigestor:可选参数,指定密码摘要器,值可以是 "server" 或 "client"。

示例1 :在单个数据库中创建用户。

db_school 数据库中创建一个具有 readWrite 角色的用户 user_school

shell 复制代码
use db_school;
db.createUser(
    {
        user: "user_school",
        pwd: "123456",
        roles: [ { role: "readWrite", db: "db_school" } ]
    }
);

执行结果如下图所示:

示例2 :创建具有多个角色和跨数据库权限的用户。

创建一个名为 user_admin 的用户,该用户在 db_school 数据库具有 readWrite 角色,在 admin 数据库具有 userAdminAnyDatabase 角色。

shell 复制代码
use admin;
db.createUser(
    {
        user: "user_admin",
        pwd: "123456",
        roles: [
            { role: "readWrite", db: "db_school" },
            { role: "userAdminAnyDatabase", db: "admin" }
        ]
    }
);

执行结果如下图所示:

示例3 :使用自定义数据创建用户。

为用户 customuser 添加了一个 contact 字段作为自定义数据,该用户对 testdb 数据库只有只读权限

创建一个名为 customuser 的用户,并为用户 customuser 添加一个 contact 字段作为自定义数据,该用户对 testdb 数据库只有只读权限。

shell 复制代码
use testdb;
db.createUser(
    {
        user: "customuser",
        pwd: "123456",
        customData: { contact: "customuser@example.com" },
        roles: [ { role: "read", db: "testdb" } ]
    }
);

执行结果如下图所示:

3. 查看用户

查看单个用户信息语法如下:

shell 复制代码
db.getUser(
    <username>,
    {
        showCredentials: <boolean>,
        showPrivileges: <boolean>,
        showAuthenticationRestrictions: <boolean>
    }
)
  • <username>:要查看信息的用户的名称,是一个字符串类型。
  • showCredentials:可选参数,布尔值。如果设置为 true,则会显示用户的认证凭证信息;默认值为 false。
  • showPrivileges:可选参数,布尔值。如果设置为 true,则会显示用户的权限信息;默认值为 false。
  • showAuthenticationRestrictions:可选参数,布尔值。如果设置为 true,则会显示用户的认证限制信息;默认值为 false。

查看所有用户信息语法如下:

shell 复制代码
db.getUsers(
    {
        showCredentials: <boolean>,
        showPrivileges: <boolean>,
        showAuthenticationRestrictions: <boolean>
    }
)

示例1 :查看 db_school 数据库中名为 user_school 的用户信息。

shell 复制代码
use db_school;
db.getUser("user_school");

执行结果如下图所示:

示例2 :查看 db_school 数据库中用户名为 user_school 的认证凭证信息和权限信息。

shell 复制代码
use db_school;
db.getUser("user_school", { showCredentials: true, showPrivileges: true });

示例3 :查看 admin 数据库中的所有用户信息。

shell 复制代码
use admin;
db.getUsers();

shell 复制代码
use admin;
show users;

执行结果如下图所示:

4. 修改用户

4.1 修改用户信息

修改用户信息语法如下:

shell 复制代码
db.updateUser(
    "<username>",
    {
        customData: { <new_custom_data> },
        roles: [ { role: "<role>", db: "<database>" }, ... ], // 可选,用于同时更新角色
        pwd: "<new_password>" // 可选,用于同时更新密码
    },
    {
        writeConcern: { <write_concern_options> } // 可选,写入关注选项
    }
)
  • <username>:要修改自定义数据的用户的名称,是一个字符串类型。
  • customData: { <newCustomData> }:新的自定义数据,是一个文档对象。
  • roles:可选参数,用于更新用户的角色列表。
  • pwd:可选参数,用于同时更新用户的密码。
  • writeConcern:可选参数,指定写入操作的确认级别。

示例 :将 testdb 数据库中 customuser 用户的自定义数据修改为 { contact: "newcontact@example.com" }。

shell 复制代码
use testdb;
db.updateUser(
    "customuser",
    {
        customData: { contact: "newcontact@example.com" }
    }
);

4.2 修改用户密码

修改用户密码语法如下:

shell 复制代码
db.changeUserPassword("<username>", "<new_password>")
  • username:要修改密码的用户的名称。
  • new_password:用户的新密码。

示例 :将 testdb 数据库中用户 customuser 的密码修改为 newSecurePass

shell 复制代码
use testdb;
db.changeUserPassword("customuser", "newSecurePass");

4.3 修改用户角色

4.3.1 添加用户角色

添加角色语法如下:

shell 复制代码
db.grantRolesToUser(
    "<username>",
    [
        { role: "<role>", db: "<database>" },
        ...
    ],
    {
        writeConcern: { <write_concern_options> } // 可选,写入关注选项
    }
)

示例 :为 testdb 数据库中的用户 customuser 添加 readWrite 角色。

shell 复制代码
use testdb;
db.grantRolesToUser(
    "customuser",
    [ { role: "readWrite", db: "testdb" } ]
);
4.3.2 撤销用户角色

撤销角色语法如下:

shell 复制代码
db.revokeRolesFromUser(
    "<username>",
    [
        { role: "<role>", db: "<database>" },
        ...
    ],
    {
        writeConcern: { <write_concern_options> } // 可选,写入关注选项
    }
)

示例 :撤销 testdb 数据库中用户 customuserreadWrite 角色。

shell 复制代码
use testdb;
db.revokeRolesFromUser(
    "customuser",
    [ { role: "readWrite", db: "testdb" } ]
);

5. 删除用户

删除用户语法如下:

shell 复制代码
db.dropUser(
    <username>,
    {
        writeConcern: <document>
    }
)

示例 :删除数据库 testdb 中的 customuser 用户。

shell 复制代码
use testdb;
db.dropUser("customuser")

执行结果如下图所示:


七、帮助信息命令

1. 查看命令帮助信息

help 命令可以查看一些基本的命令列表。这包括集合操作、数据库操作等。

shell 复制代码
help

2. 查看数据库帮助信息

db.help() 命令会显示与数据库相关的命令列表。

shell 复制代码
db.help()

3. 查看集合帮助信息

db.collection.help() 命令会显示与集合相关的命令列表。

shell 复制代码
db.collection.help()
相关推荐
m0_5557629010 分钟前
通过接口或抽象类进一步解耦
数据库·系统架构
SelectDB2 小时前
SelectDB 实时分析性能突出,宝舵成本锐减与性能显著提升的双赢之旅
大数据·数据库·数据分析
V+zmm101342 小时前
电器维修系统小程序+论文源码调试讲解
java·数据库·微信小程序·小程序·毕业设计
PawSQL2 小时前
推理模型对SQL理解能力的评测:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet
java·数据库·人工智能·sql·sql优化·pawsql·deepseek
*星星之火*2 小时前
【GPT入门】第12课 FunctionCall 生成数据库sql代码
数据库·sql·gpt
陈卓4102 小时前
Redis-缓存穿透&击穿&雪崩
数据库·redis·缓存
泡泡Java2 小时前
Redis离线安装(内网,源码安装)
数据库·redis·缓存
想做富婆2 小时前
存储过程和自定义函数在银行信贷业务中的应用(oracle)
数据库·存储过程·银行贷款业务
珹洺2 小时前
数据库系统概论(三)数据库系统的三级模式结构
java·运维·服务器·数据库·oracle
不知真不只2 小时前
数据库---sqlite3
数据库