本文最后更新于:2023年12月5日 下午

我们介绍过 MongoDB 的概述和安装方法,本文记录 MongoDB 使用方法。

概要

之前介绍过 Python MOngoDB 命令,本文记录终端常用命令

  • MongoDB 终端使用常用命令分为
  1. 连接 MongoDB
  2. 数据库、 集合操作
  3. 数据增删改查

连接 MongoDB

  • 默认情况下,MongoDB的启动端口为27017。比MongoDB启动端口大1000的端口为MongoDB的web用户界面,你可以在浏览器中输入 http://localhost:28017 来访问MongoDB的web用户界面。

  • 可以通过执行以下命令来连接MongoDB的服务。

    1
    mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
    • mongodb:// 这是固定的格式,必须要指定。
    • username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登录这个数据库
    • host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
    • portX 可选的指定端口,如果不填,默认为27017
    • /database 如果指定username:password@,连接并验证登录指定数据库。若不指定,默认打开 test 数据库。
    • ?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
  • 示例:

    连接本地数据库服务器,端口是默认的。

    1
    mongodb://localhost

    使用用户名admin,密码123456登录localhost的admin数据库。

    1
    mongodb://admin:123456@localhost

    使用用户名admin,密码123456登录localhost的w3cschool数据库。

    1
    mongodb://admin:123456@localhost/w3cschool

查看 MongoDB 版本

  • 使用命令:

    1
    db.version()

用户操作

  1. 和用户管理相关的操作基本都要在admin数据库下运行,要先use admin;
  2. 如果在某个单一的数据库下,那只能对当前数据库的权限进行操作;
  3. db.addUser是老版本的操作,现在版本也还能继续使用,创建出来的user是带有root role的超级管理员。

启用权限验证

1
mongo --auth

或者修改mongo.conf,最后一行添加 :

1
auth=true

创建用户

  • 切换管理员用户
1
use admin
  • 权限设置:

    权限 描述
    Read 允许用户读取指定数据库
    readWrite 允许用户读写指定数据库
    dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
    userAdmin 允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
    clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
    readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
    readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
    userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
    dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
    root 只在admin数据库中可用。超级账号,超级权限
  • 角色设置

    角色含义 角色
    数据库用户角色 read、readWrite
    数据库管理角色 dbAdmin、dbOwner、userAdmin
    集群管理角色 clusterAdmin、clusterManager、4. clusterMonitor、hostManage
    备份恢复角色 backup、restore
    所有数据库角色 readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
    超级用户角色 root
    内部角色 __system
  • 创建admin超级管理员用户

    指定用户的角色和数据库:
    (注意此时添加的用户都只用于admin数据库,而非你存储业务数据的数据库)
    (在cmd中敲多行代码时,直接敲回车换行,最后以分号首尾)

    1
    2
    3
    4
    5
    6
    7
    8
    9
    db.createUser(  
    { user: "admin",
    customData: {description:"superuser"},
    pwd: "admin",
    roles: [ { role: "userAdmin", db: "taobao" } ]
    }
    )

    # db.createUser( { user: "admin", customData: {description:"superuser"}, pwd: "admin", roles: [{ role: "userAdmin", db: "taobao" }]})
    • user字段,为新用户的名字;

    • pwd字段,用户的密码;

    • cusomData字段,为任意内容,例如可以为用户全名介绍;

    • roles字段,指定用户的角色,可以用一个空数组给新用户设定空角色。在roles字段,可以指定内置角色和用户定义的角色。

      超级用户的role有两种,userAdmin或者userAdminAnyDatabase(比前一种多加了对所有数据库的访问,仅仅是访问而已)。

    • db 是指定数据库的名字,admin是管理数据库。

    不能用admin数据库中的用户登录其他数据库。注:只能查看当前数据库中的用户,哪怕当前数据库admin数据库,也只能查看admin数据库中创建的用户。

  • 创建一个不受访问限制的超级用户

1
2
3
4
5
6
7
db.createUser(
{
user:"root",
pwd:"pwd",
roles:["root"]
}
)
  • 验证是否创建成功
1
db.auth('admin_user', 'admin_password')
  • 创建一个业务数据库管理员用户

    只负责某一个或几个数据库的増查改删

1
2
3
4
5
6
7
8
9
10
11
12
13
14
db.createUser({
user:"user001",
pwd:"123456",
customData:{
name:'jim',
email:'jim@qq.com',
age:18,
},
roles:[
{role:"readWrite",db:"db001"},
{role:"readWrite",db:"db002"},
'read'// 对其他数据库有只读权限,对db001、db002是读写权限
]
})

查看用户

1
show users 或 db.system.users.find() 或 db.runCommand({usersInfo:"userName"})

删除用户

1
db.dropUser('username')

更新权限

1
db.grantRolesToUser("root", [{ role: "root", db: "admin" }])

修改密码

1
db.updateUser("admin",{pwd:"admin"});
1
2
use admin
db.changeUserPassword("username", "xxx")

修改密码和用户信息

1
2
3
4
5
6
7
db.runCommand(
{
updateUser:"username",
pwd:"xxx",
customData:{title:"xxx"}
}
)

数据库操作

创建数据库

  • MongoDB 创建数据库与切换数据库是一致的语法,格式如下:
1
use DATABASE_NAME

如果数据库不存在,则创建数据库,否则切换到指定数据库。

  • 实例

以下实例我们创建了数据库 youj:

1
2
3
4
> use youj
switched to db youj
> db
youj

查看数据库

  • 查看所有数据库命令:
1
show dbs
  • 新建的数据库不会显示,只有插入了数据才会显示数据库
  • 查看当前数据库名称:
1
db

删除数据库

  • MongoDB 删除数据库的语法格式如下:

    1
    db.dropDatabase()

    删除当前数据库,默认为 test。

集合操作

创建集合

  • 正经创建集合的语法格式:
1
db.createCollection(name, options)
  • 参数说明:

    • name: 要创建的集合名称
    • options: 可选参数, 指定有关内存大小及索引的选项
  • options 可以是如下参数:

字段 类型 描述
capped 布尔 (可选)如果为 true,则创建固定集合。固定集合是指有着固定大小的集合,当达到最大值时,它会自动覆盖最早的文档。 当该值为 true 时,必须指定 size 参数。
autoIndexId 布尔 3.2 之后不再支持该参数。(可选)如为 true,自动在 _id 字段创建索引。默认为 false。
size 数值 (可选)为固定集合指定一个最大值,即字节数。 如果 capped 为 true,也需要指定该字段。
max 数值 (可选)指定固定集合中包含文档的最大数量。

在插入文档时,MongoDB 首先检查固定集合的 size 字段,然后检查 max 字段。

  • 实例

在 test 数据库中创建 runoob 集合:

1
2
3
4
> use test
switched to db test
> db.createCollection("runoob")
{ "ok" : 1 }
  • 在 MongoDB 中,你不一定要正经地创建集合。当你插入一些文档时,MongoDB 会自动创建集合。

    1
    2
    3
    4
    > db.mycol2.insert({"name" : "菜鸟教程"})
    > show collections
    mycol2
    ...

查看集合

  • 如果要查看已有集合,可以使用 show collectionsshow tables 命令:
1
2
3
> show collections
runoob
system.indexes

删除集合

  • 语法格式:
1
db.collection.drop()

如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。

  • 实例

    在数据库 mydb 中,我们可以先通过 show collections 命令查看已存在的集合:

    1
    2
    3
    4
    5
    6
    7
    8
    >use mydb
    switched to db mydb
    >show collections
    mycol
    mycol2
    system.indexes
    runoob
    >

    接着删除集合 mycol2 :

    1
    2
    >db.mycol2.drop()
    true

文档操作

插入文档

  • 使用 insert()save() 方法向集合中插入文档,语法如下:

    1
    2
    3
    db.COLLECTION_NAME.insert(document)

    db.COLLECTION_NAME.save(document)
    • save():如果 _id 主键存在则更新数据,如果不存在就插入数据。该方法新版本中已废弃,可以使用 db.collection.insertOne()db.collection.replaceOne() 来代替。
    • insert(): 若插入的数据主键已经存在,则会抛 org.springframework.dao.DuplicateKeyException 异常,提示主键重复,不保存当前数据。
  • 实例

以下文档可以存储在 MongoDB 的 w3cschool.cn 数据库 的 col集合中:

1
2
3
4
5
6
7
>db.col.insert({title: 'MongoDB 教程', 
description: 'MongoDB 是一个 Nosql 数据库',
by: 'w3cschool',
url: 'http://www.w3cschool.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
  • 查看已插入所有文档:
1
2
3
4
5
6
7
8
9
10
11
12
> db.col.find()
[
{
_id: ObjectId("631aac45a90ff4eda0a18d27"),
title: 'MongoDB 教程',
description: 'MongoDB 是一个 Nosql 数据库',
by: 'W3Cschool',
url: 'http://www.w3cschool.cn',
tags: [ 'mongodb', 'database', 'NoSQL' ],
likes: 100
}
]
  • 我们也可以将数据定义为一个变量,如下所示:
1
2
3
4
5
6
7
> document=({title: 'MongoDB 教程', 
description: 'MongoDB 是一个 Nosql 数据库',
by: 'w3cschool',
url: 'http://www.w3cschool.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
  • 执行后显示结果如下:
1
2
3
4
5
6
7
8
9
10
11
12
{
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "w3cschool",
"url" : "http://www.w3cschool.cn",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
  • 执行插入操作:
1
2
3
> db.col.insert(document)
WriteResult({ "nInserted" : 1 })
>
  • 插入文档你也可以使用 db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。

删除文档

  • 移除集合中的数据语法:
1
2
3
4
db.collection.remove(
<query>,
<justOne>
)
  • 参数说明:

    • query :(可选)删除的文档的条件。
    • justOne : (可选)如果设为 true 或 1,则只删除一个文档。
  • 实例

以下文档我们执行两次插入操作:

1
2
3
4
5
6
7
>db.col.insert({title: 'MongoDB 教程', 
description: 'MongoDB 是一个 Nosql 数据库',
by: 'w3cschool',
url: 'http://www.w3cschool.cn',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})

使用 find() 函数查询数据:

1
2
3
> db.col.find()
{ "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "w3cschool", "url" : "http://www.w3cschool.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
{ "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "w3cschool", "url" : "http://www.w3cschool.cn", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }

接下来我们移除 title 为 ‘MongoDB 教程’ 的文档:

1
2
3
4
>db.col.remove({'title':'MongoDB 教程'})
WriteResult({ "nRemoved" : 2 }) # 删除了两条数据
>db.col.find()
…… # 没有数据

如果你只想删除第一条找到的记录可以设置 justOne 为 1,如下所示:

1
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)

如果你想删除所有数据,可以使用以下方式(类似常规 SQL 的 truncate 命令):

1
2
3
>db.col.remove({})
>db.col.find()
>

更新文档

MongoDB 使用 update()save()方法来更新集合中的文档。

update()
  • update() 方法用于更新已存在的文档。语法格式如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    db.collection.update(
    <query>,
    <update>,
    {
    upsert: <boolean>,
    multi: <boolean>,
    writeConcern: <document>
    }
    )

    参数说明:

    • query : update的查询条件,类似sql update查询的where子句。
    • update : update的对象和一些更新的操作符(如$,$inc…)等,也可以理解为 sql update查询的set子句
    • upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
    • multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
    • writeConcern :可选,抛出异常的级别。
  • 实例:

    我们在集合 col 中插入如下数据:

    1
    2
    3
    4
    5
    6
    7
    8
    >db.col.insert({
    title: 'MongoDB 教程',
    description: 'MongoDB 是一个 Nosql 数据库',
    by: 'W3Cschool',
    url: 'http://www.w3cschool.cn',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
    })

    接着我们通过 update() 方法来更新标题(title):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
    WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 输出信息
    > db.col.find().pretty()
    {
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "W3Cschool",
    "url" : "http://www.w3cschool.cn",
    "tags" : [
    "mongodb",
    "database",
    "NoSQL"
    ],
    "likes" : 100
    }
    >

    可以看到标题(title)由原来的 “MongoDB 教程” 更新为了 “MongoDB”。

    以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。

    1
    >db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save()
  • save() 方法通过传入的文档来替换已有文档,_id 主键存在就更新,不存在就插入。语法格式如下:

    1
    2
    3
    4
    5
    6
    db.collection.save(
    <document>,
    {
    writeConcern: <document>
    }
    )

    参数说明:

    • document : 文档数据。
    • writeConcern :可选,抛出异常的级别。
  • 实例

    以下实例中我们替换了 _id 为 56064f89ade2f21f36b03136 的文档数据:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "W3Cshcool",
    "url" : "http://www.w3cschool.cn",
    "tags" : [
    "mongodb",
    "NoSQL"
    ],
    "likes" : 110
    })

    替换成功后,我们可以通过 find() 命令来查看替换后的数据

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    >db.col.find().pretty()
    {
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "W3Cschool",
    "url" : "http://www.w3cschool.cn",
    "tags" : [
    "mongodb",
    "NoSQL"
    ],
    "likes" : 110
    }
    >

  • 更多实例

    只更新第一条记录:

    1
    db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

    全部更新:

    1
    db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

    只添加第一条:

    1
    db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

    全部添加进去:

    1
    db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

    全部更新:

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

    只更新第一条记录:

    1
    db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

查询文档

  • 查询数据的语法格式如下:

    1
    >db.COLLECTION_NAME.find()

    find() 方法以非结构化的方式来显示所有文档。

    如果你需要以易读的方式来读取数据,可以使用 pretty() 方法,语法格式如下:

    1
    >db.col.find().pretty()

    pretty() 方法以格式化的方式来显示所有文档。

  • 实例

    以下实例我们查询了集合 col 中的数据:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    > db.col.find().pretty()
    {
    "_id" : ObjectId("56063f17ade2f21f36b03133"),
    "title" : "MongoDB 教程",
    "description" : "MongoDB 是一个 Nosql 数据库",
    "by" : "w3cschool",
    "url" : "http://www.w3cschool.cn",
    "tags" : [
    "mongodb",
    "database",
    "NoSQL"
    ],
    "likes" : 100
    }

    除了 find() 方法之外,还有一个 findOne() 方法,它只返回一个文档。

MongoDB 与 RDBMS Where 语句比较
  • 如果你熟悉常规的 SQL 数据,通过下表可以更好的理解 MongoDB 的条件语句查询:
操作 格式 范例 RDBMS中的类似语句
等于 {:} db.col.find({"by":"w3cschool"}).pretty() where by = 'w3cschool'
小于 {:{$lt:}} db.col.find({"likes":{$lt:50}}).pretty() where likes < 50
小于或等于 {:{$lte:}} db.col.find({"likes":{$lte:50}}).pretty() where likes <= 50
大于 {:{$gt:}} db.col.find({"likes":{$gt:50}}).pretty() where likes > 50
大于或等于 {:{$gte:}} db.col.find({"likes":{$gte:50}}).pretty() where likes >= 50
不等于 {:{$ne:}} db.col.find({"likes":{$ne:50}}).pretty() where likes != 50

MongoDB AND 条件

MongoDB 的 find() 方法可以传入多个键(key),每个键(key)以逗号隔开,及常规 SQL 的 AND 条件。

语法格式如下:

1
>db.col.find({key1:value1, key2:value2}).pretty()
  • 实例

以下实例通过 bytitle 键来查询 w3cschoolMongoDB 教程 的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
> db.col.find({"by":"w3cschool", "title":"MongoDB 教程"}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "w3cschool",
"url" : "http://www.w3cschool.cn",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

以上实例中类似于 WHERE 语句:WHERE by=‘w3cschool’ AND title=‘MongoDB 教程’

MongoDB OR 条件
  • MongoDB OR 条件语句使用了关键字 $or,语法格式如下:
1
2
3
4
5
6
7
>db.col.find(
{
$or: [
{key1: value1}, {key2:value2}
]
}
).pretty()
  • 实例

以下实例中,我们演示了查询键 by 值为 w3cschool 或键 title 值为 MongoDB 教程 的文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
>db.col.find({$or:[{"by":"w3cschool"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "w3cschool",
"url" : "http://www.w3cschool.cn",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}
>
AND 和 OR 联合使用
  • 以下实例演示了 AND 和 OR 联合使用,类似常规 SQL 语句为: ‘where likes>50 AND (by = ‘w3cschool’ OR title = ‘MongoDB 教程’)’
1
2
3
4
5
6
7
8
9
10
11
12
13
14
>db.col.find({"likes": {$gt:50}, $or: [{"by": "w3cschool"},{"title": "MongoDB 教程"}]}).pretty()
{
"_id" : ObjectId("56063f17ade2f21f36b03133"),
"title" : "MongoDB 教程",
"description" : "MongoDB 是一个 Nosql 数据库",
"by" : "w3cschool",
"url" : "http://www.w3cschool.cn",
"tags" : [
"mongodb",
"database",
"NoSQL"
],
"likes" : 100
}

参考资料



文章链接:
https://www.zywvvd.com/notes/coding/dataset/mongodb-usage/mongodb-usage/


“觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭”

微信二维码

微信支付

支付宝二维码

支付宝支付

MongoDB 常用命令教程
https://www.zywvvd.com/notes/coding/dataset/mongodb-usage/mongodb-usage/
作者
Yiwei Zhang
发布于
2023年1月20日
许可协议