数据库之MongoDB

原创
2018/02/17 17:55
阅读数 60

一、传统数据库技术回顾: 数据库就是存储数据的,那么存储数据就用txt就行了,为什么要用数据库? 理由之1:数据库有行、列的概念,数据有关系,数据不是散的 老牌数据库:MySQL、SQL Server、Oracle、Access。这些叫做结构型数据库 每个表中都有明确的字段,每行记录,都有这些字段,不能有的行有,有的没有 理由之2:数据库能够提出非常接口,让增删改查操作变得容易 我们老牌数据库都无一例外的使用SQL语言,管理数据库; 比如:查询所有女生: SELECT * FROM 表名 WHERE xingbie = '女' 再比如 SELECT * FROM 表名 WHERE xingbie = '女' AND nianling < 24 AND nianling >=20 理由之3:数据库不能自己玩,要给向PHP、.net、JSP等语言提供接口 用PHP这些语言,能够向数据库之中增删改查

老牌的数据库,现在出了什么问题?
老牌数据库,都是结构型数据库
比如:现在想在一个已经有1000条数据库的数据库中增加一个字段,之前已经存在的数据,实际上不需要增加这个字段,因为这些用户已经填写完表单了,不需要再增加其他信息了,我们的意图是在今后的信息字段里再增加新的字段。但是所谓字段就是表的一个结构,所有的行都必须拥有,不能有的行有这个字段,有的行没有这个字段,可想而知,大数据时代,增加时间太长;
数据不灵活,一个字段,需要是同样类型的数据,不能一行记录的是文本,一行记录的是数字
**非结构型数据库 NoSQL应运而生**
NoSQL是个怪胎,无法挑战老牌数据库,但在大数据时代有着自己的意义

**NoSQL**
没有行和列的概念,
**分类:
键值(Key-Value)存储数据库:**
这一类数据库主要会使用到一个哈希表,这个表中有一个特定的键和一个指针指向特定的数据。Key/value模型对于IT系统来说的优势在于简单、易部署。但是如果DBA只对部分值进行查询或更新的时候,Key/value就显得效率低下了。举例如:Tokyo Cabinet/Tyrant, Redis, Voldemort, Oracle BDB.
**列存储数据库:**
这部分数据库通常是用来应对分布式存储的海量数据。键仍然存在,但是它们的特点是指向了多个列。这些列是由列家族来安排的。如:Cassandra, HBase, Riak.
**文档型数据库:**
文档型数据库的灵感是来自于Lotus Notes办公软件的,而且它同第一种键值存储相类似。该类型的数据模型是版本化的文档,半结构化的文档以特定的格式存储,比如JSON。文档型数据库可 以看作是键值数据库的升级版,允许之间嵌套键值。而且文档型数据库比键值数据库的查询效率更高。如:CouchDB, MongoDb. 国内也有文档型数据库SequoiaDB,已经开源。
**图形(Graph)数据库:**
图形结构的数据库同其他行列以及刚性结构的SQL数据库不同,它是使用灵活的图形模型,并且能够扩展到多个服务器上。NoSQL数据库没有标准的查询语言(SQL),因此进行数据库查询需要制定数据模型。许多NoSQL数据库都有REST式的数据接口或者查询API。如:Neo4J, InfoGrid, Infinite Graph.

因此,我们总结NoSQL数据库在以下的这几种情况下比较适用:1、数据模型比较简单;2、需要灵活性更强的IT系统;3、对数据库性能要求较高;4、不需要高度的数据一致性;5、对于给定key,比较容易映射复杂值的环境。

我们看,有些数据库需要筛选,有筛选条件,那么SQL型数据库比较擅长,因为他有行、列的概念,但是有些系统不需要进行那么多的筛选,比如站内信,不需要筛选,只需要存储,那么就是NoSQL擅长的

NoSQL不是银弹,没有资格挑战老牌数据库,还是特定情况下,是适合的

**MongoDB**

mongo  使用数据库
mongod  开机
mongoimport  导入数据

开机命令: mongod --dbpath 存放的位置

--dbpath:就是选择数据库文档所在的文件夹,也就是说,mongoDB中,真的有物理文件,对应的一个个数据库,U盘是可以拷贝走的
一定要保持,开机的这个CMD不能动了,不能关闭,一旦这个CMD有问题了,那这个数据库就关闭了,所以,应该再开一个CMD,来进行其他的操作

mongo语法:
show dbs 列出所有数据库
use 数据库名字:使用某个数据库
use 新建数据库名字:新建一个数据库
db 查看当前所在的数据库

db. student. insert({'name':'xiaoming','age':12})
student:就是所谓的集合,集合中存储着很多json
db.一个未知的集合名字,这个集合将自动创建

删除数据库 要管理数据库,必须先开机,开机使用mongod --dbpath 存放的位置 管理数据库:mongo (一定要在新的CMD里面) 查看所有数据库列表:show dbs 使用数据库、创建数据库:use 数据库名 如果真的想把这个数据库创建成功,那么必须插入一个数据 数据库中不能直接插入数据,只能往集合(collections)中插入数据,不需要创建集合,只需要写点语法 db.student.insert({}) db.student 系统发现student是一个陌生的集合名字,所以就自动创建集合

删除数据库:db.dropDatabase() 删除当前所在的数据库

插入数据,随着数据的插入,数据库创建成功了,集合也创建成功了。 db.student.insert({'name':'xiaoming'})

我们不可能一条一条的insert,所以,我们希望用sublime在外部写好数据,然后导入数据库里面 导入外部数据: mongoimport --db test --collection restaurants --drop --file primer-dataset.json --db test 往哪个数据库里面导入 --collection restaurants 往哪个数据库里面的集合中导入 --drop 把之前集合中的数据清空 --file primer-dataset.json 要导入数据的那个文件 这样,我们就能用创建一个json文件,然后导入数据库中

1、查找数据:用find。如果find中没有任何参数,那么将列出这个集合的所有文档 db.集合名.find() 精确匹配: db.student.find({'score.shuxue':70}) 多个条件:多个条件用逗号隔开 db.student.find({'score.shuxue':80,'age':20}) 大于条件:$gt db.student.find({'score.shuxue':{$gt:50}}) 小于条件:$lt db.student.find({'score.shuxue':{$lt:50}}) 与运算用逗号 或运算用 or db.student.find({ $or: [{'score.shuxue':{$lt:50},{'score.yuwen':{$gt:60}}}] }) 查找完毕之后,打点调用sort,表示升降顺序 db.restaurants.find().sort({'borough':1,'address.zipcode':1}) 2、删除 删除集合:db.student.drop() 删除集合student 删除所有数学大于80的 删除数据:db.student.remove({'score.shuxue':{$gt:80}}) 如果只想删除一个数据 删除数据:db.student.remove({'score.shuxue':{$gt:80}},{justOne:true}) 删除所有的数据:db.student.remove( {} ) 3、修改数据 db.student.update({'name':'xiaoming'},{$set:{'age':16}}) 修改姓名为xiaoming的数据,修改数据为,age属性值修改为16 批量修改数据: 查找数学成绩是70的同学,把所有的年龄更改为20 db.student.update({'score.shuxue':70},{$set:{'age':20},{multi:true}})

替换小明的所有数据
db.student.update({'name':'xiaoming'},{'name':'xiaoqiang','age':20...})  把$set这个关键字去掉就是替换所有的属性值
展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部