在网络交互的过程中,不仅会有数据的传递,也会有新数据的产生。比如我们目前的网站登录注册项目,在用户注册后,我们只是把数据添加到了服务器的内存中,但是程序一旦关闭或者重启,内存中的数据就消失了,服务器会恢复到最初的样子,那注册的用户数据也就没有了。这对于网站来讲,是不可接受的。那么如何解决这个问题呢?
服务器程序,就像是我们大脑的记忆,并不是长久的,一旦重启,就会失忆。俗话说,好记性不如烂笔头。因此最好的办法,就是把数据记录并保存下来。
在早期的网站中,通过把数据写入到文件中来进行保存,即便电脑关闭重启,文件也不会消失。但慢慢的又发现了问题,当文件存储内容过多的时候,很难找到我们想要的那条数据,而且,读取文件也是一个非常耗时的过程。
为了能够更好的存储数据,数据库应运而生,在本系列课程中,我们要使用的数据库是MongoDB。
图书馆是一个存储图书的地方,粮仓是用来存储粮食的。数据库,顾名思义,就是专门用来存储数据的仓库。存储在数据库中的数据,能够长期的保存,并且易于查找。
在数据库中,数据不是杂乱无章的,它们会放在一个一个的小盒子里,在MongoDB中这些盒子就称为集合。一个数据库中可以有多个集合,而集合中存储的是一条一条的数据。
NoSQL(NoSQL = Not Only SQL ),意即"不仅仅是SQL"。
在现代的计算系统上每天网络上都会产生庞大的数据量。
这些数据有很大一部分是由关系数据库管理系统(RDBMS)来处理。 1970年 E.F.Codd's提出的关系模型的论文 "A relational model of data for large shared data banks",这使得数据建模和应用程序编程更加简单。
通过应用实践证明,关系模型是非常适合于客户服务器编程,远远超出预期的利益,今天它是结构化数据存储在网络和商务应用的主导技术。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
启动失败:FAIled to start mongod.service: Unit mongod.service not found.
启动: sudo mongod [--auth --dbpath=dbpath --logpath=logpath --append --fork] [-–f logfile ]
配置文件启动
sudo mongod -f mogo_start.cfg
dbpath=/home/cat/data/db
logpath=/home/cat/data/mongodb.log
logappend=true
fork=true
mongoDB文档存储是使用BSON类型,BSON(BSON short for Binary JSON, is a binary-encoded serialization of JSON-like documents)是二进制序列化的形式。类如JSON,同样支持内嵌各种类型。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中
下表为MongoDB 常用的几种数据类型:
数据类型 |
描述 |
String |
字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer |
整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean |
布尔值。用于存储布尔值(真/假)。 |
Double |
双精度浮点值。用于存储浮点值。 |
Array |
用于将数组或列表或多个值存储为一个键。 |
Timestamp |
时间戳。记录文档修改或添加的具体时间。 |
Object |
用于内嵌文档。 |
Null |
用于创建空值。 |
Date |
日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID |
对象 ID。用于创建文档的 ID。 (每个文档都有) |
ObjectId 类似唯一主键,可以很快的去生成和排序,包含 12 bytes,含义是:
如果文档的_id已经存在则修改,如果_id不存在则添加
1.db.集合名称.find({条件文档})
2.方法findOne():查询,只返回第一个db.集合名称.findOne({条件文档})
3.方法pretty(): 将结果格式化;不能和findOne()一起使用!db.集合名称.find({条件文档}).pretty()
1.等于: 默认是等于判断, 没有运算符
2.小于:$lt (less than)
3.小于等于:$lte (less than equal)
4.大于:$gt (greater than)
5.大于等于:$gte
6.不等于:$ne
1.and:在json中写多个条件即可
2.or:使用$or, 值为数组, 数组中每个元素为json
3.范围运算符:使用$in, $nin 判断数据是否在某个数组内
1.shell 是一个js的执行环境
2.使用$where写一个函数, 返回满足条件的数据
3.db.stu.find({ $where:function() { return this.age + 10>= 18; } })
1.db.集合名称.find({},{字段名称:1,...})
2.参数为字段与值, 值为1表示显示, 值为0不显
3.特别注意:对于_id列默认是显示的, 如果不显示需要明确设置为0对于其他不显示的字段不能设置为0db.stu.find({},{_id:0,name:1,gender:1})
1.参数1为升序排列
2.参数-1为降序排列
3.db.stu.find().sort({score:-1,age:1})
1.db.集合名称.estimated_document_count()
2.db.集合名称.count_documents({条件})
1.参数query:查询条件
2.参数update:更新操作符
3.参数multi:可选,默认是false,表示只更新找到的第一条数据,值为true表示把满足条件的数据全部更新multi参数必须和$set一起使用!
1.参数query:可选,删除的⽂档的条件
2.参数justOne:可选, 如果设为true或1,则只删除一条,默认false,表示删除全部