MK
摩柯社区 - 一个极简的技术知识社区
AI 面试

MongoDB Shell初体验:运行与基本操作

2021-05-064.0k 阅读

MongoDB Shell 环境准备与启动

在开始 MongoDB Shell 的初体验之前,首先要确保 MongoDB 已经正确安装在你的系统中。以 Linux 系统为例(不同操作系统安装步骤略有差异),可以通过包管理器(如 apt-get 或 yum)来安装 MongoDB。

安装完成后,启动 MongoDB 服务。在 Linux 下,使用以下命令启动服务:

sudo systemctl start mongod

要运行 MongoDB Shell,在终端中输入 mongo 命令。默认情况下,MongoDB Shell 会尝试连接到本地主机(localhost)上运行的 MongoDB 实例的默认端口(27017)。如果连接成功,你会看到类似于以下的输出:

MongoDB shell version v4.4.6
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("xxxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx") }
MongoDB server version: 4.4.6

这表明你已经成功进入 MongoDB Shell 环境,可以开始执行各种 MongoDB 操作了。

数据库操作

创建和切换数据库

在 MongoDB 中,使用 use 命令来创建或切换数据库。如果指定的数据库不存在,MongoDB 会在你首次向该数据库插入数据时自动创建它。

例如,要创建或切换到名为 testdb 的数据库,在 MongoDB Shell 中输入:

use testdb

输出结果会显示你当前所在的数据库:

switched to db testdb

查看所有数据库

要查看系统中当前存在的所有数据库,可以使用 show dbs 命令。例如:

show dbs

输出结果可能如下:

admin   0.000GB
config  0.000GB
local   0.000GB

这里列出的是 MongoDB 系统默认创建的数据库。admin 数据库用于管理相关操作,config 数据库用于存储分片集群的配置信息,local 数据库用于存储本地数据。

删除数据库

要删除当前使用的数据库,可以使用 db.dropDatabase() 方法。例如,假设当前使用的是 testdb,要删除它:

db.dropDatabase()

输出结果会显示数据库是否成功删除:

{ "dropped" : "testdb", "ok" : 1 }

集合操作

创建集合

集合类似于关系型数据库中的表,用于存储文档。在 MongoDB 中,可以使用 db.createCollection() 方法来创建集合。

例如,在 testdb 数据库中创建一个名为 users 的集合:

use testdb
db.createCollection("users")

输出结果如下:

{ "ok" : 1 }

你还可以在创建集合时指定一些选项,比如设置集合的最大文档数量或最大存储大小。例如,创建一个最大存储大小为 10MB,最大文档数量为 10000 的集合 products

db.createCollection("products", { capped : true, size : 10 * 1024 * 1024, max : 10000 } )

这里 capped 表示该集合是固定集合,它有固定的大小,当达到最大大小后,新插入的文档会覆盖旧的文档。

查看集合

要查看当前数据库中的所有集合,可以使用 show collections 命令。例如:

use testdb
show collections

如果 testdb 数据库中有 usersproducts 集合,输出结果如下:

products
users

删除集合

要删除当前数据库中的某个集合,可以使用 db.collection_name.drop() 方法。例如,要删除 users 集合:

use testdb
db.users.drop()

输出结果会显示集合是否成功删除:

true

文档操作

插入文档

文档是 MongoDB 中数据的基本单元,类似于关系型数据库中的行。要向集合中插入文档,可以使用 insertOne()insertMany() 方法。

使用 insertOne() 方法插入单个文档。例如,向 users 集合中插入一个用户文档:

use testdb
db.users.insertOne(
   {
     "name": "John Doe",
     "age": 30,
     "email": "johndoe@example.com"
   }
)

输出结果如下:

{
    "acknowledged" : true,
    "insertedId" : ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx")
}

这里 acknowledged 表示 MongoDB 是否确认插入操作成功,insertedId 是插入文档的唯一标识符。

使用 insertMany() 方法插入多个文档。例如,向 users 集合中插入多个用户文档:

use testdb
db.users.insertMany([
   {
     "name": "Jane Smith",
     "age": 25,
     "email": "janesmith@example.com"
   },
   {
     "name": "Bob Johnson",
     "age": 35,
     "email": "bobjohnson@example.com"
   }
])

输出结果如下:

{
    "acknowledged" : true,
    "insertedIds" : [
        ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx"),
        ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx")
    ]
}

查询文档

使用 find() 方法来查询集合中的文档。例如,要查询 users 集合中的所有文档:

use testdb
db.users.find()

输出结果会列出 users 集合中的所有文档,格式如下:

{ "_id" : ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx"), "name" : "John Doe", "age" : 30, "email" : "johndoe@example.com" }
{ "_id" : ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx"), "name" : "Jane Smith", "age" : 25, "email" : "janesmith@example.com" }
{ "_id" : ObjectId("xxxxxxxxxxxxxxxxxxxxxxxx"), "name" : "Bob Johnson", "age" : 35, "email" : "bobjohnson@example.com" }

你可以在 find() 方法中传入查询条件来过滤文档。例如,查询年龄大于 30 岁的用户:

use testdb
db.users.find( { "age": { $gt: 30 } } )

这里 $gt 是 MongoDB 的比较操作符,表示“大于”。

更新文档

使用 updateOne()updateMany() 方法来更新集合中的文档。例如,要将 users 集合中名字为 John Doe 的用户年龄更新为 31:

use testdb
db.users.updateOne(
   { "name": "John Doe" },
   { $set: { "age": 31 } }
)

这里 $set 操作符用于指定要更新的字段和值。输出结果如下:

{
    "acknowledged" : true,
    "matchedCount" : 1,
    "modifiedCount" : 1
}

matchedCount 表示匹配到的文档数量,modifiedCount 表示实际更新的文档数量。

如果要更新所有符合条件的文档,可以使用 updateMany() 方法。例如,将所有年龄大于 30 岁的用户年龄增加 1:

use testdb
db.users.updateMany(
   { "age": { $gt: 30 } },
   { $inc: { "age": 1 } }
)

这里 $inc 操作符用于增加字段的值。

删除文档

使用 deleteOne()deleteMany() 方法来删除集合中的文档。例如,要删除 users 集合中名字为 Jane Smith 的用户文档:

use testdb
db.users.deleteOne( { "name": "Jane Smith" } )

输出结果如下:

{
    "acknowledged" : true,
    "deletedCount" : 1
}

deletedCount 表示删除的文档数量。

如果要删除所有符合条件的文档,可以使用 deleteMany() 方法。例如,删除所有年龄小于 25 岁的用户文档:

use testdb
db.users.deleteMany( { "age": { $lt: 25 } } )

这里 $lt 是比较操作符,表示“小于”。

MongoDB Shell 中的聚合操作

聚合操作是 MongoDB 中用于处理数据的强大工具,它允许你对文档进行分组、过滤、排序、求和等复杂操作。聚合操作使用 aggregate() 方法。

简单的分组和计数

假设我们有一个 orders 集合,每个文档代表一个订单,包含 customeramount 字段。要统计每个客户的订单数量,可以使用以下聚合操作:

use testdb
db.orders.aggregate([
   {
     $group: {
       _id: "$customer",
       orderCount: { $sum: 1 }
     }
   }
])

这里 $group 操作符用于按 customer 字段对文档进行分组,_id 字段指定分组的依据,orderCount 字段使用 $sum 操作符对每个分组中的文档进行计数。

分组求和

要计算每个客户的订单总金额,可以这样写:

use testdb
db.orders.aggregate([
   {
     $group: {
       _id: "$customer",
       totalAmount: { $sum: "$amount" }
     }
   }
])

这里 $sum 操作符对每个分组中的 amount 字段值进行求和。

结合过滤和聚合

先过滤出金额大于 100 的订单,然后再进行分组求和:

use testdb
db.orders.aggregate([
   {
     $match: {
       amount: { $gt: 100 }
     }
   },
   {
     $group: {
       _id: "$customer",
       totalAmount: { $sum: "$amount" }
     }
   }
])

这里 $match 操作符用于过滤出符合条件的文档,然后再进行分组求和。

MongoDB Shell 中的索引操作

索引可以显著提高查询性能。在 MongoDB 中,可以使用 createIndex() 方法来创建索引。

创建单字段索引

例如,在 users 集合的 email 字段上创建索引:

use testdb
db.users.createIndex( { email: 1 } )

这里 1 表示升序索引,如果使用 -1 则表示降序索引。输出结果如下:

{
    "createdCollectionAutomatically" : false,
    "numIndexesBefore" : 1,
    "numIndexesAfter" : 2,
    "ok" : 1
}

numIndexesBeforenumIndexesAfter 分别表示创建索引前后集合中的索引数量。

创建复合索引

如果需要根据多个字段进行查询,可以创建复合索引。例如,在 users 集合的 nameage 字段上创建复合索引:

use testdb
db.users.createIndex( { name: 1, age: 1 } )

这样在根据 nameage 进行查询时,性能会得到提升。

查看索引

要查看集合中的所有索引,可以使用 getIndexes() 方法:

use testdb
db.users.getIndexes()

输出结果会列出集合中的所有索引信息,包括索引名称、字段和排序方向等。

删除索引

要删除某个索引,可以使用 dropIndex() 方法。例如,要删除之前创建的 email 字段上的索引:

use testdb
db.users.dropIndex( { email: 1 } )

输出结果如下:

{ "nIndexesWas" : 2, "ok" : 1 }

这里 nIndexesWas 表示删除索引之前集合中的索引数量。

MongoDB Shell 的高级特性

脚本执行

你可以将 MongoDB Shell 命令保存到一个文件中,然后通过 mongo 命令来执行该文件。例如,创建一个名为 script.js 的文件,内容如下:

use testdb
db.users.insertOne(
   {
     "name": "New User",
     "age": 28,
     "email": "newuser@example.com"
   }
)

然后在终端中执行:

mongo script.js

这样就会在 testdb 数据库的 users 集合中插入一个新的文档。

变量和函数

在 MongoDB Shell 中,可以定义变量和函数。例如,定义一个函数来计算两个数的和:

function addNumbers(a, b) {
   return a + b;
}
var result = addNumbers(3, 5);
print(result);

这里定义了 addNumbers 函数,然后调用该函数并将结果存储在 result 变量中,最后使用 print() 函数输出结果。

游标操作

当使用 find() 方法查询文档时,返回的是一个游标。游标可以用于迭代结果集。例如:

use testdb
var cursor = db.users.find();
while (cursor.hasNext()) {
   var doc = cursor.next();
   printjson(doc);
}

这里通过 hasNext() 方法判断游标是否还有下一个文档,然后使用 next() 方法获取下一个文档,并使用 printjson() 函数输出文档内容。

通过以上对 MongoDB Shell 的运行与基本操作的介绍,你已经对 MongoDB Shell 有了较为深入的了解。通过不断实践和探索,你可以更加熟练地使用 MongoDB Shell 进行各种数据库操作,充分发挥 MongoDB 的强大功能。在实际应用中,要根据具体的业务需求合理运用这些操作,以实现高效的数据管理和处理。同时,要注意性能优化,合理创建索引、优化查询语句等,确保 MongoDB 数据库的高效运行。在进行复杂操作时,如聚合操作,要深入理解每个操作符的含义和用法,以获得准确的结果。对于索引操作,要谨慎创建和管理索引,避免过多索引导致性能下降。在脚本执行和高级特性的使用中,要充分利用其灵活性,提高开发效率。总之,通过对 MongoDB Shell 的深入掌握,可以为开发基于 MongoDB 的应用程序打下坚实的基础。