MongoDB数据库管理常用命令
内容目录
这是一个非常基础的MongoDB教程,旨在新手入门阅读,进阶请翻阅官方文档,不定期更新.
MongoDB官方文档: https://docs.mongodb.com/
小提示:在执行相关操作命令前一定要注意用户是否有该数据库的权限,MongoDB默认登陆的数据库为test
,如果你不用use
切换数据库直接执行命令会提示权限不足。
Error: error: { "ok" : 0, "errmsg" : "not authorized on todolist to execute command { find: \"todo\", filter: {} }", "code" : 13, "codeName" : "Unauthorized" }
一 MongoDB用户管理
在使用用户帐户功能前你需要开启数据库基于角色的访问控制,开启方法
vi /etc/mongod.conf
找到security
参数,取消前面的注释并做以下修改
security: authorization: enabled
1.1 删除用户
登录admin数据库
mongo -u mongo-admin -p --authenticationDatabase admin
删除用户使用db.dropUser()
方法
use admin db.dropUser("myuser")
可选: 或者使用db.runCommand
和dropUser
方法
use admin db.runCommand( { dropUser: "myuser" } )
成功删除后会返回true
,否则会返回false
1.2 更新用户组
使用方法db.updateUser()
,官方使用说明
db.updateUser( "userName", { roles : [ { role : "dbAdmin", db : "dbName" }, { role : "readWrite", db : "dbName" } ] } )
1.3 更新用户密码
方法db.changeUserPassword()
,官方使用说明
use admin db.changeUserPassword("username", "SOh3TbYhx8ypJPxmt1oOfL")
1.4 创建用户
方法db.createUser()
,官方使用说明
use admin db.createUser({user: "mongo-admin", pwd: "password", roles:[{role: "userAdminAnyDatabase", db: "admin"}]})
二 MongoDB数据库管理
2.1 创建数据库
use DATABASE_NAME
创建一个名为mydb
的数据库
use mydb switched to db mydb
查看当前连接的数据库: db
db mydb
查看全部数据库:
show dbs local 0.78125GB test 0.23012GB
2.2 删除数据库
推荐方法: 使用dropDatabase()
方法(需要注意的是用户得有删除权限,具体Roles参数点击查看)
use mydb; db.dropDatabase();
执行成功后会返回
{ "ok" : 1 }
可选: 使用--eval
参数删除
在命令行中可以使用一行命令来完成
mongo <dbname> --eval "db.dropDatabase()"
可选: 其他方法
使用systemctl stop mongod
命令停止MongoDB服务后删除数据库文件目录,删除后再重启服务
三 集合Collections的管理
集合的理解很简单:就是关系型数据库中的表,存储数据的
https://docs.mongodb.com/manual/reference/method/db.createCollection/
3.1 创建集合
db.
createCollection
(name, options)
需要重点说明的是 options中可以指定集合的类型的capped
参数,当设置成true的时候我们会创建一个固定集合(Capped Collection),反之设置为false的时候会创建一个标准集合。
固定集合具有固定的大小,并且在auto-FIFO和age-out方面有很高的性能(具体怎么个高法得有数据支持,这里只讨论怎么做),age-out是基于插入顺序的。
固定集合自动维护插入顺序,在某些特殊的使用场景中非常有效,例如系统运行日志、监控数据(历史数据),在RDBMS中就需要做分区表,定期清理,而mongodb中只要设置好size或者max值则不需要考虑。
创建:
和标准collection不同,capped collection
需要你定义collection的大小size,也就是说只要你指定了capped
参数为true
的时候你必须要定义size
的值,这里size
的单位是byte,实际size是256byte的倍数,max
表示最多文档数量,非必须。固定集合的官方说明
db.createCollection("log", { capped : true, size : 5242880, max : 5000 } )
需要说明的是:当固定集合达到设定的上限的时候会自动覆盖旧数据
创建一个无文档数量限制的固定集合
db.createCollection("people", { size: 2147483648 } )
创建一个标准集合
db.createCollection("log", { capped : false } )
显示所有集合
show collections
3.2 删除集合和数据
删除某个集合(非删除数据)需要使用方法 db.collection.drop()
db.students.drop()
上面的方法会删除整个 students 集合
如果我们需要清空集合中的数据或删除部分符合条件的数据怎么办呢?
这时候我们需要使用 db.collection.remove()
方法
注意: drop()
和 remove()
是不一样的,前者删除整个集合,后者删除集合中的数据!!!
示例:
删除整个bios
集合中的数据(等同于清空表)
db.bios.remove( { } )
删除符合条件的集合中的数据
下面这行命令会删除 products
集合中所有条件符合qty大于20
的数据
db.products.remove( { qty: { $gt: 20 } } )
删除 products
集合中一条符合条件符合qty大于20
的数据(指定justOne
参数为true
)
db.products.remove( { qty: { $gt: 20 } }, true )
3.3 数据创建
MongoDB 使用 insert()
或 save()
方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
示例
db.students.insert({ name : "John Doe", attributes: { age : 13, address : "123 Main St", phone : 8675309 }})
以上实例中 students
是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档。
选项: 我们也可以把数据定义为一个变量来完成创建
var a = { name : "John Doe", attributes: { age : 13, address : "123 Main St", phone : 8675309 }}
使用insert()
方法插入
db.students.insert(a)
3.4 数据查找
找出我们刚刚创建的数据需要用到db.collection.find()
方法
db.students.find()
根据条件查找名字符合"John Doe"的数据
db.students.find({"name" : "John Doe"})
3.2 版本后还有以下几种语法可用于插入文档(来源: http://www.runoob.com/mongodb/mongodb-insert.html):
db.collection.insertOne()
:向指定集合中插入一条文档数据db.collection.insertMany()
:向指定集合中插入多条文档数据
# 插入单条数据 > var document = db.collection.insertOne({"a": 3}) > document { "acknowledged" : true, "insertedId" : ObjectId("571a218011a82a1d94c02333") } # 插入多条数据 > var res = db.collection.insertMany([{"b": 3}, {'c': 4}]) > res { "acknowledged" : true, "insertedIds" : [ ObjectId("571a22a911a82a1d94c02337"), ObjectId("571a22a911a82a1d94c02338") ] }
3.5 文档/数据的删除
MongoDB的文档可以理解成数据记录,针对文档的删除有两个方法:
db.collection.deleteMany()
db.collection.deleteOne()
其实在上面3.2集合管理段落中的时候知道 db.collection.remove()
亦可对文档执行删除操作,后来查阅了一些资料发现两者的区别:
db.collection.deleteMany()
在执行后会返回执行成功与失败的布尔值,如果删除成功还会返回对应的删除文档数量.
db.collection.remove()
执行成功后会返回删除的文档数量 WriteResult({ "nRemoved" : 4 })
另外删除单个文档的时候使用remove()
方法的时候需要指定justOne
参数为True
.
3.6 文档/数据的更新
db.collection.
update
(query, update, options)
详细参数
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document>, collation: <document>, arrayFilters: [ <filterdocument1>, ... ] } )
参数说明:
query
: update的查询条件,类似sql update查询内where后面的。update
: update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的upsert
: 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。multi
: 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。writeConcern
:可选,抛出异常的级别。
使用示例
更新people
集合中姓名为Andy
的文档
db.people.update( { name: "Andy" }, { name: "Andy", rating: 1, score: 1 }, { upsert: true } )