轻松掌握mongodb


mongodb 是一种非关系型的,面向文档的数据库,也是nosql类的产品

memcache,redis等等

与mysql最大的区别:
mongodb 使用javascript语言操作,保存是以json形式保存,mysql使用的是sql

mongodb 在读写方面性能非常快(插入,查询),相对数据来说,事务,视图,存储过程都没有,无模式

mongodb的扩展(实现分表,分库,读写分离,分布式存储)容易
mongodb适合存储:数据结构简单,数据量非常大,高并发读写的操作.像(日志系统,股票系统)

mongodb在保存关系复杂的数据时不太容易,不支付关系和连表操作相对数据中一对多和多对多的关系,不如mysql方便

实际操作:
1.安装mongodb
2.先创建一个目录(用来存放mongodb中的数据)和一个文件(mongodb的日志文件)

mongodb.exe --install --dbpath xxxx --logpath xxxx

3运行mongo.exe
mongo.exe ip地址:端口号/数据库名

mongodb 默认没有开启权限验证机制,如果要开启需要先创建好管理员账号才行

在客户端可以直接执行javascript代码
客户端的使用:
1.db变量的使用,当前正在使用的数据库
2.切换数据库: use 库名
3.查看所有的数据库 show dbs;
4.如何查看都有哪些命令,帮助系统 a)help系统级别帮助 b)db.help()数据库级别的帮助
c)db.集合名字.help() 集合级别的帮助

插入操作
db.goods.insert({'goods_name':'peak'}) 插入记录时如果记录中没有_id字段,mongodb会自动添加上一个id字段,这个字段的类型是objectId值是个字符串,这个字符串是全球唯一的
db.goods.find();查询
特点:mongodb执行的每个操作都是瞬间完成的,执行命令时,把命令发给服务器,就继续处理下一个,不会等待结果返回,所以客户端也不知道这次哦操作有没有成功

获取上次有没有成功 db.runcommand({getLastError:1})

特点:同一个集合中可以插入完

var u = db.goods.fin({'username':'tom'})
u.age =20;
db.goods.save(u);


var user = db.user.findone({'username':'tom'})

db.goods.update({'username':'tom'},{'age':50})

for(var i= 1;i<100;i++){
db.goods.insert({'username':'tom'})})
}


db.goods.update({'age':{'$lt':10}},{$set:{'age':99}},true,true);默认值改一个,第三个true就是添加上如果没有字段就直接添加上了 加上第四个true就全部修改了

mongodb权限机制
启动权限机制之前必须要先在mongodb中添加管理员账号:
1.选择数据库 use admin
2.db.addUser(用户名,密码,是否只读)
db.auth(用户名,密码) 登录

如:db.addUser('root','123',true);

启动权限机制: 需要重新安装一个mongodb,安装时添加一个--auth参数
1. xxx/xxx/mongod.exe --remove //先把安装好的从服务中删除掉(删除后之前的数据存在)
2.mongodb.exe --install --dbpath xxxx --logpath xxxx --auth
现在就开启了权限机制

开启权限后,必须先登录才能获取到数据
db.auth('test','admin');

登录超级管理员,必须先切换数据库
use admin
ad.auth(root','123')

如何使用php操作mongodb  

要用php操作mongodb,必须装mongo扩展
1.先下载一个符合php服务器环境php_mongo.dll文件
2.解压后根据 php版本, 编译器compiler,线程安全,根据 php extension build选择 ,在phpinfo里面查看
3.把dll文件复制到 extension_dir 路径下
4.修改php.ini文件添加一行 extension=php_mongo_dll
5.重启apache
<?php

$mongo = new Mongo("mongodb://test:admin@127.0.0.1/php34");//用户名/密码/主机/数据库名
//查询出所有的记录,命令
$mongo->php34->goods->find();
foreach ($goods as $key => $value) {
echo $v['username'].'<br/>';
}

//插入命令
$mongo->php34->goods->insert(
array(
'username'=>'peak'
)
);
?>

新浪微博 redis
优酷视频 mongodb
视觉中国网站 mongodb
google bigtable
amazon simpledb
淘宝数据平台 tair

每条记录不超过16M

db.shutdownServer() 是在程序中停掉服务器

mongodb只能存储utf8
客户端将数据转化成Bson的形式,然后送入服务器
服务器解析BSON
检验是含"_id"键

支持的数据类型:
{'x':null}
{'x':true}
{'x':new date()}
{'x':/^abc/i}
{'x':function(){}}
{'x':undefined}
{'x':[1,2,3]}

删除数据:
db.user.remove({'age':10}) 删除user集合中年龄等于10的文档
remove只是删除掉记录,集合和索引还在
db.drop_collection("user")删除整个集合及索引,速度快
修改数组:
$push 数组添加
$pop 从数组的首或者尾取出数据
db.user.insert({"name":'abc'})
db.user.update({"name":"abc"},{"$push":{"friend":"bcd"}})
从abc的好友中删除最后一个好友
db.user.update({"name":"abc"},{"$pop":{"friend":1}})
从abc的好友中删除第一个好友
db.user.update({"name":"abc"},{"$pop":{"friend":-1}})
使用修改器:
$inc:加一个数字
$set:修改某一个字段,如果该字段不存在就增这个字段
把abc的年龄加2
db.user.update({"name":"abc"},{"$inc":{"age":2}})
修改abc的电话号码,如果没有这个字段就新增这个字段
db.user.update({"name":"bac"},{"$set":{"tel":"1234444"}})

db.user.find({"age":{"$lt":20}})
db.user.find({"name":/^abc/i)
db.user.find({"name":/abc/)相当于 like

限制与聚合
limit:限制记录条件
skip:忽略前N条记录
sore:排序 -1(降序) 1(升序)
count:记录数
db.songs.find().count();总的记录数
db.songs.find({"type":"Mp3"}).limit(50).sort({"price":-1})

创建索引
db.user.ensureIndex({"username":1})升序索引
db.user.ensureIndex({"username":1})降序索引

db.user.ensureIndex({"username":1},{"unique":true})
查看与删除索引

db.user.getIndexes() 查看user集合上的索引
db.user.dropIndex(age) 删除user集合上,年龄字段的索引
db.user.dropIndexes() 删除user集合上的所有索引

查看/删除账号
db.system.users.find() 查看
db.system.users.remove({"user":"test"})删除test账户

固定集合是一种尺寸固定的环形的集合,按照顺序一个一个数据插入,当集合数据满了之后,再继续插入会覆盖掉前面的数据,继续掉入
创建固定集合
db.createCollection("name":{capped:true,size:1024,max:100});size:集合的尺寸 ,max集合中最大的记录数

转换普通集合为固定集合
db.runCommand(convertToCapped:"test","size":1000);
自然排序,按插入的顺序排序
db.collection.find().sort({"$natural":1})
db.collection.find().sort({"$natural":-1})相反插入顺序

GridFS基本原理
GridFS是建立在普通文档基本上的轻量级的文件存储规范
1.把打的文件分成很多块,每块作为一个单独的文档存储,这样就可以存储大文件
2.没有碎片
3.支持复制与分片功能
4.使用fs.files和fs.chunks集合存储数据

GridFS用来在mongodb中存储文件,主要使用mongofiles.exe命令来完成文件的上传,下载,删除等功能
mongofiles.exe put test.txt 将test.txt放入mongodb
mongofiles.exe list
mongofiles.exe search filename
mongofiles.exe get filename
mongofiles.exe delete filename
主要是为了实现分布式存储 (文件切分成好几个文件中放在不同的服务器)

高级功能:
分片: 大文件abcd 插入配置管理服务器 第一台服务器存ab 第二台服务器存cd
复制:将主机数据复制到其他机器上,主要用来备份,故障恢复,读扩展(读写分离)等
大文件abcd 主服务器 从服务器存abcd 从服务器存abcd

查看服务器状态
db.runCommand({"serverStatus":1})

hadoop(java写的) 提供了一套机制,可以快速的处理大数据
map(每台服务器要做的工作) reduce(每台服务器上的结果如何汇总成一个结果) + 分布式文件系统
hdfs
大数据


启动主服务器
mongod.exe --master --bind_ip 127.0.0.1 --port 27012 --dbpath 数据目录 --logpath 日志目录
启动从服务器
mongod.exe --slave --source 127.0.0.1:27012 --dbpath 数据目录 --logpath 日志目录

备份与恢复
mongodump -d 要备份的数据库名 -o 输出目录
mongorestore -d 恢复到的数据库名 --drop备份文件目录
实例1:备份test数据库到d:\dk mongodump -d test -o d:\dk
实例2:恢复test数据库倒test1数据库中 mongorestore -d test1 -drop d:\dk

 

posted @ 2019-07-29 16:42  代码堆里的看客  阅读(167)  评论(0编辑  收藏  举报