目录

MongoDB二-MongoDB命令详解

/weixin_miniapp.png

MongoDB(二) - MongoDB命令详解


前言

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


一、数据库操作

1. 切换/创建数据库

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

use <database_name>

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

use db_demo1

2. 查看数据库

2.1 查看所有数据库

show dbs

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/f34ab8e67f474da7be4fc27b8e60e4e0.png

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

2.2 查看当前数据库

db

https://i-blog.csdnimg.cn/direct/07258309c8ce4027b2469aa5160f7f88.png

3. 删除数据库

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

db.dropDatabase()

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

db
db.dropDatabase()
db

https://i-blog.csdnimg.cn/direct/6769bf6bff894accb4b301662775223b.png


二、集合操作

1. 创建集合

创建集合语法如下:

db.createCollection(<collection_name>)

创建集合 c_demo1 。

db.createCollection('c_demo1')

https://i-blog.csdnimg.cn/direct/8ebb396f67d940998d18af333c030f3f.png

2. 查看集合

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

show collections

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/a8659381100d4560b82a4376eb7be9e7.png

3. 删除集合

删除集合语法如下:

db.<collection_name>.drop()

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

db.c_demo1.drop()

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/52020de4435a4eb78576426d3cce3c8f.png


三、文档操作

1. 插入文档

1.1 单文档插入

单文档插入语法如下:

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

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/fbf8dc7a120e4e4890784285c0300ef8.png

1.2 多文档插入

多文档插入语法如下:

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

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/3560b25f9d1c46eaa8b93e020cd7e085.png

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/beaee408ace04abeafc39ca0fd475fc0.png

2. 更新文档

2.1 单文档更新

更新语法如下:

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、

    se

    t

    、 inc 等)来修改文档的字段。

    • $set :用于设置文档中指定字段的值。如果该字段不存在,则会创建该字段;如果字段已存在,则会更新其值。
    • $inc :用于对文档中指定的数字字段进行增量操作,即增加或减少该字段的值。该字段必须是数字类型,否则会报错。
    • $unset :用于从文档中删除指定的字段。
    • $push :用于向数组字段中添加一个元素。如果数组字段不存在,则会创建该数组字段并添加元素。
    • $pull :用于从数组字段中移除所有匹配指定值的元素。
    • $addToSet :用于向数组字段中添加一个元素,但只有当该元素不在数组中时才会添加,避免数组中出现重复元素。
  • upsert :可选参数,布尔值。如果设置为 true,当没有匹配的文档时,会插入一个新文档;默认值为 false。

  • writeConcern :可选参数,指定写入操作的确认级别。

  • collation :可选参数,指定用于操作的排序规则。

  • arrayFilters :可选参数,用于过滤数组元素。

  • hint :可选参数,指定使用哪个索引进行查询

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

db.c_demo2.updateOne(
  { "name": "Alice" },
  { $set: { "age": 26 } }
);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/a187c538342e435aa1124aa87d6bf23c.png

2.2 多文档更新

多文档更新语法如下:

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

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

db.c_demo2.updateMany(
  { "age": { $gt: 20 } },
  { $set: { "name": "new_name" } }
);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/0b1eedb062c6428cb3f69629d3b32e1c.png

3. 删除文档

3.1 单文档删除

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

单文档删除语法如下:

db.<collection_name>.deleteOne(
   <filter>,
   {
     writeConcern: <document>
   }
)

示例 :删除集合 c_demo2 中 name 为 new_name 的第一个文档。

db.c_demo2.deleteOne({ "name": "new_name" });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/c4fe4d1074df4d3f910db2b624061259.png

3.2 多文档删除

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

多文档删除语法如下:

db.<collection_name>.deleteMany(
   <filter>,
   {
     writeConcern: <document>
   }
)

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

db.c_demo2.deleteMany({ "age": { $gt: 30 } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/c6e6ed47180d49dc83c19e16be407b73.png


四. 查询文档

1. 基本查询

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

查询语法如下:

db.<collection_name>.find(<query>, <projection>)

或

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

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

db.c_demo2.find({ "age": 30 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/40ea6b65550e47e0a90824540ed4a786.png

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

db.c_demo2.find({});

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/10e9ec0cc1eb4787adda918e18cb41d2.png

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_demo2 中 age 大于等于 25 的所有文档。

db.c_demo2.find({ "age": { $gte: 25 } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/978bc6b4a9ec4c2fa0dcfdee6fd8cbbc.png

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/40528f9b50e3423fa4f000c57e4c0bdd.png

3. 数组查询

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

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

db.c_demo3.find({ "scores": { $elemMatch: { $gt: 85 } } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/2cd3f999b3f24aa5a45af82466b1529c.png

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

db.c_demo3.find({ "scores": { $size: 3 } });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ae92ea817f59487095d0ed598ff69491.png

4. 投影

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

示例1 : 包含指定字段 :查询集合 c_demo2 中 name 和 city 字段,排除 _id 字段。

db.c_demo2.find({}, { "name": 1, "city": 1, "_id": 0 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ed1aee801d70480bb304fa7d6ac5d5a8.png

示例2 : 排除指定字段 :排除 _id 和 name 字段。

db.c_demo2.find({}, { "_id": 0, "name": 0 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/2e751afeee9141a3afb6f07cdebb9fd3.png

5. 其他查询

5.1 查询第一个匹配的文档

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

db.c_demo2.findOne({ "name": "new_name" });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/cb206c9e6f864363a7203022332a042d.png

5.2 限制返回文档的数量

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

db.c_demo2.find().limit(2);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/0797b639d9274f358705ab6827de4e01.png

5.3 跳过指定数量的文档

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

db.c_demo2.find().skip(3);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/0c6e3d8379ef4e11a4dde3b0323baf96.png

5.4 排序查询

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

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

db.c_demo2.find({}, { "_id": 0 }).sort({ "age": 1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/26e4f148a76f421ba03047b18326a952.png

5.5 嵌套文档查询

示例1 :查询集合 c_demo3 中 name 为 zhangsan ,且嵌套文档 info 中 age 为 30 和 address 为 yunnan 的第一个匹配的文档。

db.c_demo3.findOne({ "name": "zhangsan", "info.age": 30, "info.address": "yunnan" });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7ee556d7f95a436aa47ff0ebeee7c1a3.png

5.6 正则表达式查询

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

db.c_demo2.find({ "city": /^Los/ });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/1cd242e89a424e04a6960b8cd372cdf6.png

6. 聚合操作

6.1 聚合操作符

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

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

6.2 聚合操作示例

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7806134e2fd64d6daa39829e85b49f92.png

示例 1
使用 $group 计算每个类别的总和, _id 用于指定分组字段 。
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            totalValue: { $sum: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/be759b6340594b769e12f10ce44ded8c.png

示例 2
使用 $match 过滤特定类别的文档。
db.c_demo4.aggregate([
    {
        $match: { category: "A" }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/1c5b7e7879804b69bbc7099c62a395b8.png

示例 3
使用 $sort 对文档排序。
db.c_demo4.aggregate([
    {
        $sort: { value: -1 }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7947ff06370b4d5bb42554a735528a14.png

示例 4
使用 $project 修改文档结构。
db.c_demo4.aggregate([
    {
        $project: {
            _id: 0,
            category: 1,
            value: 1
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ba436f5c272445a8b87caa12ec51c613.png

示例 5
使用 $skip 和 $limit 分页查询。
db.c_demo4.aggregate([
    { $skip: 2 },
    { $limit: 2 }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/41877a85a3b749908aa4fc47906fbe64.png

示例 6
使用 $avg 计算平均值,_id 为 null 表示不分组,即把整个集合视为一个单一的组。
db.c_demo4.aggregate([
    {
        $group: {
            _id: null,
            averageValue: { $avg: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/c8e4bc4a4e50485fb9aa17ad44f2494a.png

示例 7
使用 $min 和 $max 找出最小值和最大值。
db.c_demo4.aggregate([
    {
        $group: {
            _id: null,
            minValue: { $min: "$value" },
            maxValue: { $max: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/d3a597f0d956496395963c955f07240f.png

示例 8
使用 $push 收集数组中的元素。
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            values: { $push: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/5572d2abfeae4ffc9fde7e645b02570c.png

示例 9
使用 $first 和 $last 返回数组中的第一个和最后一个元素。
db.c_demo4.aggregate([
    {
        $group: {
            _id: "$category",
            firstValue: { $first: "$value" },
            lastValue: { $last: "$value" }
        }
    }
])

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/6e759a16264041ecb47194bca245aa3e.png

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操作语法结构如下 :

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操作。

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/43fdb41d73804738b7ac801173085fde.png

示例 :

定义Map函数 :这个函数会遍历每个文档,并为每个客户发出一个键值对,其中键是客户名,值是订单金额。

定义Reduce函数 :这个函数接收Map阶段输出的键和对应的值列表,并计算总和。

执行Map-Reduce :使用上面定义的Map和Reduce函数执行Map-Reduce操作,并将结果存储在一个新的集合 order_totals 中。

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/e159822fcf9f4ab7b3672fe8843a36c9.png

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

db.order_totals.find();

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/86c840c3526040349267cadb4649abb9.png


五、索引操作

1. MongoDB索引介绍

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

2. MongoDB索引类型

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

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

3. 创建索引

创建索引语法如下:

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

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

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" } }
]);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/f267d5509ce041899893a39dfae280ab.png

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

db.students.createIndex({ name: 1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/40744eac244f40569578ca6bc41ca3e4.png

  • “numIndexesBefore”: 1 :这表示在创建新索引之前,集合中已经存在的索引数量。由于MongoDB默认会在 _id 字段上自动创建一个索引,所以这里显示的是1。
  • “numIndexesAfter”: 2 :这表明在成功创建新索引之后,集合中现在总共有的索引数量。因为刚刚为 name 字段创建了一个新的升序索引,所以索引总数从1增加到了2。
  • “createdCollectionAutomatically”: false :这个字段指示是否因为创建索引而自动创建了集合。在这个例子中,值为 false ,意味着集合 students 在执行此操作之前已经存在,并非因创建索引而自动创建的。
  • “ok”: 1 :这是一个状态标识符,表明操作成功完成。如果出现错误,这个字段的值会是 0 ,并且通常会有额外的错误信息来描述问题所在。

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

db.students.createIndex({ age: 1, scores: -1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/7a3fb9cf6f424b0eb63292ab6eafe78d.png

4. 查看索引

查看索引语法如下:

db.<collection_name>.getIndexes();

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

db.students.getIndexes();

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/5a471d3100cc41e09da66004965501e5.png

5. 删除索引

5.1 删除单个索引

删除单个索引语法如下:

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

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

db.students.dropIndex("name_1");

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/8c561bba9d0e4cc7a3c777091f9bcf1f.png

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

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

db.students.dropIndex({ age: 1, scores: -1 });

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ac77f4e471d043f8816c86244b460aeb.png

5.2 删除多个索引

删除多个索引语法如下:

db.<collection_name>.dropIndexes(
    <indexes>,
    {
        writeConcern: <document>
    }
);

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

db.students.dropIndexes();

或

db.students.dropIndexes("*");

示例2 :

分别为 name 和 age 字段创建升序索引。

db.students.createIndex({ name: 1 });
db.students.createIndex({ age: 1 });

根据索引名称删除 name 和 age 字段的升序索引。

db.students.dropIndexes(["age_1", "name_1"]);

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ac7273458dfc4703876015a96a89a35b.png


六、用户和权限管理

1. 内置角色及相关权限

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

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

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

2. 创建用户

创建用户语法如下:

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 。

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ec23bd7c7cb143babe30927b041ce46a.png

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

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/ff55db6afaeb4e95b57ca11c86570d8d.png

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

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

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

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

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/d70660b1ef284a44bfcbc78bf27c1b14.png

3. 查看用户

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

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

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

db.getUsers(
    {
        showCredentials: <boolean>,
        showPrivileges: <boolean>,
        showAuthenticationRestrictions: <boolean>
    }
)

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

use db_school;
db.getUser("user_school");

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/debe0e3c9a304c30b2011ba6a0df634d.png

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

use db_school;
db.getUser("user_school", { showCredentials: true, showPrivileges: true });

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

use admin;
db.getUsers();

或

use admin;
show users;

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/fe48e2d7eaa74729b1f0015b19429fc3.png

4. 修改用户

4.1 修改用户信息

修改用户信息语法如下:

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” }。

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

4.2 修改用户密码

修改用户密码语法如下:

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

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

use testdb;
db.changeUserPassword("customuser", "newSecurePass");

4.3 修改用户角色

4.3.1 添加用户角色

添加角色语法如下:

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

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

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

撤销角色语法如下:

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

示例 :撤销 testdb 数据库中用户 customuser 的 readWrite 角色。

use testdb;
db.revokeRolesFromUser(
    "customuser",
    [ { role: "readWrite", db: "testdb" } ]
);

5. 删除用户

删除用户语法如下:

db.dropUser(
    <username>,
    {
        writeConcern: <document>
    }
)

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

use testdb;
db.dropUser("customuser")

执行结果如下图所示:

https://i-blog.csdnimg.cn/direct/addafaee75f74e9593d59ebc9b7b66ed.png


七、帮助信息命令

1. 查看命令帮助信息

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

help

2. 查看数据库帮助信息

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

db.help()

3. 查看集合帮助信息

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

db.collection.help()

/weixin_miniapp.png