MongoDB教程(二)--- mongodb 基本操作

MongoDB的使用

mongod:

mongo 是启动MongoDB shell客户端的命令

mongod 是启动MongoDB数据库服务的命令,主要提供了三种启动方式:

1. 命令行方式直接启动

MongoDB默认的存储数据目录为/data/db(需要事先创建),默认端口27017,也可以修改成不同目录:

# 直接启动mongod,默认数据存储目在 /data/db
python@ubuntu:~$ sudo mongod

# 启动mongod,并指定数据存储目录(目录必须存在,且有读写权限)
python@ubuntu:~$ sudo mongod --dbpath=/xxxxx/xxxxx

2. 配置文件方式启动

启动时加上-f参数,并指向配置文件即可,默认配置文件为/etc/mongodb.cnf,也可以自行编写配置文件并指定。

# 启动mongod,并按指定配置文件执行
python@ubuntu:~$ sudo mongod -f /etc/mongodb.cnf

3. 守护进程方式启动

- 启动

MongoDB提供了一种后台程序方式启动的选择,只需要加上—fork参数即可。但是注意:如果用到了--fork参数,就必须启用--logpath参数来指定log文件,这是强制的。

python@ubuntu:~$ sudo mongod --logpath=/data/db/mongodb.log --fork

about to fork child process, waiting until server is ready for connections.
forked process: xxxxx
child process started successfully, parent exiting

- 关闭

如果使用--fork在后台运行mongdb服务,那么就要通过本机admin数据库向服务器发送shutdownServer()消息来关闭。

python@ubuntu:~$ mongo
MongoDB shell version: 3.2.8
connecting to: test

> use admin
switched to db admin

> db.shutdownServer()
server should be down...
2017-05-16T22:34:22.923+0800 I NETWORK  [thread1] trying reconnect to 127.0.0.1:27017 (127.0.0.1) failed
2017-05-16T22:34:22.923+0800 W NETWORK  [thread1] Failed to connect to 127.0.0.1:27017, reason: errno:111 Connection refused
2017-05-16T22:34:22.923+0800 I NETWORK  [thread1] reconnect 127.0.0.1:27017 (127.0.0.1) failed failed 
>

3. 启用用户认证方式启动

如果之前未定义过用户,所以mongod将允许本地直接访问操作数据库将使用本地root权限,如果使用--auth参数启动,将启用MongoDB授权认证,即启用不同的用户对不同的数据库的操作权限。

也可以在配置文件mongod.conf中加入auth = true按第二种启动方式启动。

# 启动mongod,并启用用户认证
python@ubuntu:~$ sudo mongod --auth
# 启动mongo shell
python@ubuntu:~$ mongo
MongoDB shell version: 3.2.8
connecting to: test

# 1. 切换admin数据库下
> use admin
switched to db admin

# 2. 创建一个拥有root权限的超级用户,拥有所有数据库的所有权限
#      用户名:python,密码:chuanzhi,角色权限:root(最高权限)
> db.createUser({user : "python", pwd : "chuanzhi", roles : ["root"]})

Successfully added user: { "user" : "python", "roles" : [ "root" ] }

# 3. 如果 MongoDB 开启了权限模式,并且某一个数据库没有任何用户时,可以不用认证权限并创建一个用户,但是当继续创建第二个用户时,会返回错误,若想继续创建用户则必须认证登录。
> db.createUser({user : "bigcat", pwd : "bigcat", roles : [{role : "read", db : "db_01"}, {role : "readWrite", db : "db_02"}]})
couldn't add user: not authorized on admin to execute command{ createUser: "bigcat", pwd: "xxx", roles: [ { role: "read", db: "db_01" }, { role: "readWrite", db: "db_02" } ], digestPassword: false, writeConcern: { w: "majority", wtimeout: 30000.0 } } :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.createUser@src/mongo/shell/db.js:1267:15

# 4. 认证登录到python用户(第一次创建的用户)
> db.auth("python","chuanzhi")
1
>
# 5. 查看当前认证登录的用户信息
> show users
{
    "_id" : "admin.python",
    "user" : "python",
    "db" : "admin",
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ]
}

> 

# 6. 认证登录成功,可以继续创建第二个用户
#      用户名:bigcat,密码:bigcat,角色权限:[对db_01 拥有读权限,对db_02拥有读/写权限]
> db.createUser({user : "bigcat", pwd : "bigcat", roles : [{role : "read", db : "db_01"}, {role : "readWrite", db : "db_02"}]})
Successfully added user: {
    "user" : "bigcat",
    "roles" : [
        {
            "role" : "read",
            "db" : "db_01"
        },
        {
            "role" : "readWrite",
            "db" : "db_02"
        }
    ]
}

# 7. 查看当前数据库下所有的用户信息.
> db.system.users.find()
{ "_id" : "admin.python", "user" : "python", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "y/3yPLzhDKa7cJ3Zd/8DXg==", "storedKey" : "9XaUqiUteEtFAfof3k+HJjevqCA=", "serverKey" : "YjIoUPl7HTHQZuklSFXXYpZB/U4=" } }, "roles" : [ { "role" : "root", "db" : "admin" } ] }
{ "_id" : "admin.bigcat", "user" : "bigcat", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "ZcCaT057Gz0WODuSx70Ncg==", "storedKey" : "pNYyLMPisTcYuUHMdR46vndteIo=", "serverKey" : "IOzB2pyBRyCgKTNNSf1wljsVxms=" } }, "roles" : [ { "role" : "read", "db" : "db_01" }, { "role" : "readWrite", "db" : "db_02" } ] }

>
# 8. 认证登录到 bigcat 用户
> db.auth("bigcat", "bigcat")
1
>
# 9. 切换到 数据库db_01,读操作没有问题
> use db_01
switched to db db_01
> show collections
> 
# 10. 切换到 数据库db_02,读操作没有问题
> use db_02
switched to db db_02
> show collections
> 
# 11. 切换到 数据库db_03,读操作出现错误,bigcat用户在db_03数据库下没有相关权限
> use db_03
switched to db db_03
> show collections
2017-05-17T00:26:56.143+0800 E QUERY    [thread1] Error: listCollections failed: {
    "ok" : 0,
    "errmsg" : "not authorized on db_03 to execute command { listCollections: 1.0, filter: {} }",
    "code" : 13
} :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype._getCollectionInfosCommand@src/mongo/shell/db.js:773:1
DB.prototype.getCollectionInfos@src/mongo/shell/db.js:785:19
DB.prototype.getCollectionNames@src/mongo/shell/db.js:796:16
shellHelper.show@src/mongo/shell/utils.js:754:9
shellHelper@src/mongo/shell/utils.js:651:15
@(shellhelp2):1:1

>
# 12. 认证登录到python用户下
> db.auth("python", "chuanzhi")
1
>
# 13. 删除bigcat用户
> db.dropUser("bigcat")
true
>
# 14. 尝试认证登录bigcat失败
> db.auth("bigcat", "bigcat")
Error: Authentication failed.
0
>
# 15. 退出mongo shell
> exit
bye
python@ubuntu:~$

参考阅读:[http://www.mongoing.com/docs/tutorial/enable-authentication.html)

mongod部分参数说明(了解):

dbpath:数据文件存放路径。每个数据库会在其中创建一个子目录,防止同一个实例多次运行的mongod.lock也保存在次目录中。

logpath:错误日志文件

auth:用户认证

logappend:错误日志采用追加模式(默认覆写模式)

bind_ip:对外服务的绑定ip,一般设置为空,及绑定在本机所有可用ip上。如有需要可以单独绑定。

port:对外服务端口。Web管理端口在这个port的基础上+1000。

fork:以后台Daemon形式运行服务。

journal:开启日志功能,通过保存操作日志来降低单机故障的恢复时间。

syncdelay:系统同步刷新磁盘的时间,单位为秒,默认时60秒。

directoryperdb:每个db存放在单独的目录中,建议设置该参数。

repairpath:执行repair时的临时目录。如果没有开启journal,异常down机后重启,必须执行repair操作。

在源代码中,mongod的参数分为一般参数,windows参数,replication参数,replica set参数以及隐含参数。上面列举的时一般参数。

mongod的参数中,没有设置内存大小的相关参数,因为MongoDB使用os mmap机制来缓存数据文件数据,自身目前不提供缓存机制。mmap在数据量不超过内存时效率很高,但是数据超过内存后,写入的性能不太稳定。

MongoDB 统计信息(了解)

要获得关于MongoDB的服务器统计,需要在MongoDB客户端键入命令db.stats()。这将显示数据库名称,收集和数据库中的文档信息。输出的命令如下所示

了解下一下各个参数

"db" : "test" ,表示当前是针对"test"这个数据库的描述。想要查看其他数据库,可以先运行$ use datbasename
"collections" : 3,表示当前数据库有多少个collections.可以通过运行show collections查看当前数据库具体有哪些collection.
"objects" : 267,表示当前数据库所有collection总共有多少行数据。显示的数据是一个估计值,并不是非常精确。
"avgObjSize" : 623.2322097378277,表示每行数据是大小,也是估计值,单位是bytes
"dataSize" : 16640,表示当前数据库所有数据的总大小,不是指占有磁盘大小。单位是bytes
"storageSize" : 110592,表示当前数据库占有磁盘大小,单位是bytes,因为mongodb有预分配空间机制,为了防止当有大量数据插入时对磁盘的压力,因此会事先多分配磁盘空间。
"numExtents" : 0,没有什么真实意义
"indexes" : 2 ,表示system.indexes表数据行数。
"indexSize" : 53248,表示索引占有磁盘大小。单位是bytes
"ok" : 1,表示服务器正常

MongoDB快速入门

MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

1. 数据库

数据库是一个集合的物理容器。一个单一的MongoDB服务器通常有多个数据库。如自带的admin、test,或自行创建的数据库。

2. 集合

也称为文档组,类似于关系数据库中的表格。

集合存在于数据库中,一个数据库可以包含很多个集合。集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。

比如,我们可以将以下不同数据结构的文档插入到集合中:

{"site" : "www.baidu.com"}
{"site" : "www.google.com", "name" : "Google"}
{"site" : "www.itcast.cn", "name" : "传智播客", "num" : [100, 200, 300]}

当第一个文档数据插入时,集合就会被创建。

3. 文档

MongoDB使用了BSON(Binary JSON)这种结构来存储数据,并把这种格式转化成了文档这个概念,每个文档是一组 键 : 值 的数据。

RDBMS VS MongoDB

下面给出的表显示RDBMS(关系型数据库管理系统)术语 与 MongoDB 的关系

SQL术语/概念MongoDB术语/概念解释/说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument数据记录行/文档
columnfield数据属性/字段(域)
indexindex索引
primary keyprimary key主键,MongoDB默认自动将_id字段设置为主键,可以手动设置
  • 通过下图实例,我们也可以更直观的的了解SQL和MongoDB的对比:

数据库基本命令

  • 连接成功后,默认使用test数据库
  • 查看当前数据库名称
> db
  • 查看所有数据库名称,列出所有在物理上存在的数据库
> show dbs
  • 切换数据库,如果数据库不存在也并不创建,直到插入数据或创建集合时数据库才被创建
> use 数据库名称
  • 删除当前指向的数据库,如果数据库不存在,则什么也不做
> db.dropDatabase()

 

集合命令

  • 创建语法如下
  • name是要创建的集合的名称
  • options是一个文档,用于指定集合的配置,选项​​参数是可选的,所以只需要到指定的集合名称
  • 可以不手动创建集合,向不存在的集合中第一次加入数据时,集合会被创建出来
db.createCollection(name, options)

创建集合stu

#例1:不限制集合大小

db.createCollection("stu")


#例2:限制集合大小

- 参数capped:默认值为false表示不设置上限,值为true表示设置上限
- 参数size:当capped值为true时,需要指定此参数,表示上限大小,当文档达到上限时,会将之前的数据覆盖,单位为字节
语法 :

>db.createCollection("stu", {capped : true, size : 6142800} )
{ "ok" : 1 }
  • 查看当前数据库的集合
show collections
  • 删除命令
db.stu.drop()

 

数据类型

下表为MongoDB中常用的几种数据类型:

  • ObjectID:文档ID
  • String:字符串,最常用,必须是有效的UTF-8
  • Boolean:存储一个布尔值,true或false
  • Integer:整数可以是32位或64位,这取决于服务器
  • Double:存储浮点值
  • Arrays:数组或列表,多个值存储到一个键
  • Object:用于嵌入式的文档,即一个值为一个文档
  • Null:存储Null值
  • Timestamp:时间戳,表示从1970-1-1到现在的总秒数
  • Date:存储当前日期或时间的UNIX时间格式

创建日期语句如下,注意参数的格式为YYYY-MM-DD

Date('2017-12-20')

ObjectID

_id是一个12字节的十六进制数,保证每一份文件的唯一性。你可以自己去设置_id插入文档。如果没有提供,那么MongoDB的每个文档提供了一个独特的ID,这12个字节:

  • 前4个字节为当前时间戳;

  • 之后的3个字节的机器ID;

  • 接下来的2个字节的MongoDB的服务进程id;

  • 剩余3个字节是简单的增量值

  • 一个字节等于2位十六进制(一位十六进制的数等于四位二进制的数。一个字节等于8位二进制数)

 

插入

  • 语法
> db.集合名称.insert(document)
  • 插入文档时,如果不指定_id参数,MongoDB会为文档分配一个唯一的ObjectId
  • 例1
> db.stu.insert({name:'gj',gender:1})
  • 例2
> s1={_id:'20160101',name:'hr'}
> s1.gender=0
> db.stu.insert(s1)

简单查询

  • 语法
db.集合名称.find()

更新

  • 语法
db.集合名称.update(
   <query>,
   <update>,
   {multi: <boolean>}
)
  • 参数query:查询条件,类似sql语句update中where部分
  • 参数update:更新操作符,类似sql语句update中set部分
  • 参数multi:可选,默认是false,表示只更新找到的第一条记录,值为true表示把满足条件的文档全部更新
  • 例3:全文档更新
db.stu.update({name:'hr'},{name:'mnc'})
  • 例4:指定属性更新,通过操作符$set
db.stu.insert({name:'hr',gender:0})
db.stu.update({name:'hr'},{$set:{name:'hys'}})
  • 例5:修改多条匹配到的数据
db.stu.update({},{$set:{gender:0}},{multi:true})

保存

  • 语法
db.集合名称.save(document)
  • 如果文档的_id已经存在则修改,如果文档的_id不存在则添加

  • 例6

db.stu.save({_id:'20160102','name':'yk',gender:1})
  • 例7
db.stu.save({_id:'20160102','name':'wyk'})

删除

  • 语法
db.集合名称.remove(
   <query>,
   {
     justOne: <boolean>
   }
)
  • 参数query:可选,删除的文档的条件
  • 参数justOne:可选,如果设为true或1,则只删除一条,默认false,表示删除多条
  • 例8:只删除匹配到的第一条
db.stu.remove({gender:0},{justOne:true})
  • 例9:全部删除
db.stu.remove({})

创建示例数据

  • 创建集合stu,文档的属性包含:_id、name、hometown、age、gender
  • 示例数据如下:
db.stu.drop()
db.stu.insert({_id : 1, name:'郭靖',hometown:'蒙古',age:20,gender:true})
db.stu.insert({_id : 2, name:'黄蓉',hometown:'桃花岛',age:18,gender:false})
db.stu.insert({_id : 3, name:'华筝',hometown:'蒙古',age:18,gender:false})
db.stu.insert({_id : 4, name:'黄药师',hometown:'桃花岛',age:40,gender:true})
db.stu.insert({_id : 5, name:'段誉',hometown:'大理',age:16,gender:true})
db.stu.insert({_id : 6, name:'段王爷',hometown:'大理',age:45,gender:true})
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值