MongoDB Shell初体验:运行与基本操作
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
数据库中有 users
和 products
集合,输出结果如下:
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
集合,每个文档代表一个订单,包含 customer
和 amount
字段。要统计每个客户的订单数量,可以使用以下聚合操作:
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
}
numIndexesBefore
和 numIndexesAfter
分别表示创建索引前后集合中的索引数量。
创建复合索引
如果需要根据多个字段进行查询,可以创建复合索引。例如,在 users
集合的 name
和 age
字段上创建复合索引:
use testdb
db.users.createIndex( { name: 1, age: 1 } )
这样在根据 name
和 age
进行查询时,性能会得到提升。
查看索引
要查看集合中的所有索引,可以使用 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 的应用程序打下坚实的基础。