什么是数据库?在网络交互过程中,不仅会传输数据,还会产生新的数据。比如我们现在的网站登录注册项目,用户注册后,我们只是把数据添加到服务器的内存中,但是一旦程序关闭或者重启,内存中的数据就会消失,服务器又会返回它的原始状态。用户数据不见了。这对于一个网站来说是不可接受的。那么如何解决这个问题呢?服务器程序就像我们大脑的记忆一样,是不长久的,一旦重启就会失去记忆。俗话说,烂笔不如好记性。因此,最好的方法是记录和保存数据。在早期的网站中,数据是通过写入文件的方式保存的,即使电脑关机重启,文件也不会消失。但是慢慢地,我们发现了一个问题。当存储的文件过多时,很难找到我们想要的那条数据。而且,读取文件也是一个非常耗时的过程。为了更好地存储数据,数据库应运而生。在本系列课程中,我们要使用的数据库是MongoDB。图书馆是存放书籍的地方,粮仓是用来存放粮食的。数据库,顾名思义,就是专门用来存储数据的仓库。存储在数据库中的数据可以长期保存,并且易于查找。在数据库中,数据并不是杂乱无章的,它们会一个一个地放在一个个小盒子里,这些盒子在MongoDB中被称为集合。一个数据库中可以有多个集合,集合一个一个存储数据。MongoDBNoSQL(NoSQL=NotOnlySQL)简介,意思是“不仅仅是SQL”。在现代计算系统中,网络上每天都会产生大量的数据。这些数据的很大一部分由关系数据库管理系统(RDBMS)处理。1970年,E.F.Codd的论文“Arelationalmodelofdataforlargeshareddatabanks”提出了关系模型,使得数据建模和应用程序编程变得更加容易。实践证明,关系模型非常适合客户端-服务器编程,远远超出预期的好处,是当今网络和商业应用中结构化数据存储的主导技术。NoSQL是一场全新的数据库革命运动。早期提出,2009年风潮愈演愈烈。NoSQL的支持者提倡使用非关系型数据存储。与关系数据库的铺天盖地的使用相比,这个概念无疑是一种新的思维注入。易于扩展:NoSQL数据库种类繁多,但一个共同的特点是去除了关系型数据库的关系型特征。数据之间没有关系,所以很容易扩展大数据量,高性能:NoSQL数据库具有非常高的读写性能,特别是在大数据量的情况下。由于其非关系特性,该数据库具有简单灵活的数据模型:NoSQL不需要为要存储的数据预先创建字段,可以随时存储自定义数据格式。在关系数据库中,增删字段是一件很麻烦的事情。MongoDB是用C++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,增加更多的节点可以保证服务器的性能。MongoDB旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB将数据存储为文档,数据结构由键值对(key=>value)组成。MongoDB文档类似于JSON对象。字段值可以包含其他文档、数组和文档数组。安装:sudoaptinstall-ymongodb默认端口:27017默认配置文件位置:/etc/mongod.conf默认日志位置:/var/log/mongodb/mongod.log查看日志:grep-v'#'/etc/mongodb.conf创建和删除数据库创建/切换数据库:使用DATABASE_NAME,如果数据库不存在则创建数据库,否则切换到指定的数据库。默认使用test数据库,不用切换数据库。查看所有数据库:showdbs/showdatabases删除当前数据库:db.dropDatabase()创建和删除集合创建集合:db.createCollection(name,options)db.createCollection('stu',{capped:true,size:200,max:2})参数capped:默认为false,表示不设置上限,值为true,表示设置上限。参数size:集合占用的字节数。当capped值为true时,需要指定该参数,表示上限大小。当文档达到上限时,会覆盖之前的数据,单位为字节参数max:最大文档数查看集合:showcollections删除集合:db.collectionname.drop()检查集合是否被上限:collectionname.isCapped()启动方法:测试启动启动:sudoservicemongodstartstop:sudoservicemongodstop重启:sudoservicemongodrestart启动失败:启动mongod.service失败:未找到Unitmongod.service。解决方案创建配置文件:sudovim/etc/systemd/system/mongodb.service[Unit]Descriptinotallow=高性能,无模式的面向文档的数据库After=network.target[Service]User=mongodbExecStart=/usr/bin/mongod--quiet--config/etc/mongod.conf[Install]WantedBy=multi-user.target启动服务sudosystemctlstartmongodbsudosystemctlstatusmongodb检查是否启动成功:psaux|grepmongod永久启动:sudosystemctlenablemongodb生产环境正式启动方式启动:sudomongod[--auth--dbpath=dbpath--logpath=logpath--append--fork][--flogfile]只用sudo时mongod命令启动,数据默认存放在/data/db目录下,需要手动创建--dbpath:指定数据库的存放路径--logpath:指定日志的存放路径--append:或--logappend设置日志写法为追加方式--fork:或-fork启动一个新进程运行mongodb服务--f:或-f配置文件路径(可以将以上配置信息写入一个文件,然后通过文件中的参数加载启动)--auth:启动配置文件,权限认证,启动sudomongod-fmogo_start.cfgdbpath=/home/cat/data/dblogpath=/home/cat/data/mongodb.loglogappend=truefork=truemongoDB支持的数据类型mongoDB文档存储采用BSON类型,BSON(BSON是BinaryJSON的简称,是一种二进制-encodedserializationofJSON-likedocuments)是二进制序列化的一种形式,例如JSON,它也支持嵌入各种类型。一个MongoDB实例可以容纳多个独立的数据库,每个数据库都有自己的集合和权限,不同的数据库也放在不同的文件中。下表列出了MongoDB常用的几种数据类型:数据类型描述String字符串。用于存储数据的常用数据类型。在MongoDB中,UTF-8编码的字符串是合法的。整数整数值。用于存储值。根据你使用的服务器,可以分为32位或者64位。Boolean布尔值。用于存储布尔值(true/false)。Double双精度浮点值。用于存储浮点值。Array用于存储一个数组或列表或多个值作为键。时间戳时间戳。记录修改或添加文档的时间。对象用于嵌入文档。Null用于创建空值。日期日期时间。以UNIX时间格式存储当前日期或时间。您可以指定自己的日期和时间:创建一个Date对象并传入年、月和日信息。对象ID对象ID。用于创建文档的ID。 (每个文档都有)ObjectIdObjectId类似于一个唯一的主键,可以快速生成和排序。它包含12个字节。含义是:前4个字节代表创建Unix时间戳,GMTUTC时间,北京时间晚8小时,后面3个字节是机器识别码,后面两个字节由进程id组成,最后一个PID的三个字节是随机数。)db.stu.insert({name:'小明',gender:true,age:10,class:'2年4班',score:100})db.stu.insert([{name:'小梅',gender:false,age:12,class:'2年3班',score:90},{name:'xiaohong',gender:false,age:12,class:'2年3班',score:96},{name:'Jack',gender:false,age:12,class:'2years2classes',score:98},{name:'Allen',gender:true,age:12,class:'2years3class',score:90}])插入文档时,如果不指定_id参数,MongoDB会自动为文档分配一个唯一的ObjectId。在mongodb中保存:db.collectionname.save(document)如果文档的_id已经存在然后修改,如果_id不存在,添加mongodb查询1.db.collectionname.find({conditiondocument})2.方法findOne():查询,只返回第一个db.collectionname.findOne({conditionDocumentation})3.方法pretty():格式化结果;不能与findOne()一起使用!db.Collectionname.find({conditionaldocument}).pretty()比较运算符1.等于:默认等于判断,无运算符2.小于:$lt(小于)3.小于等于:$lte(小于等于)4.大于:$gt(大于)5.大于等于:$gte6。不等于:$ne逻辑运算符1.and:只要在json中写多个条件即可2.or:使用$or,取值是一个数组,数组中的每个元素都是json3。范围操作运算符:使用$in、$nin判断数据是否在数组中使用$regex编写正则表达式:db.stu.find({name:{$regex:'^Zhang'}})自定义查询1.shell是一个js执行环境2.使用$where写一个函数,返回满足条件的数据3.db.stu.find({$where:function(){returnthis.age+10>=18;}})skip和limit分页查询:db.stu.find().skip((page-1)*num).limit(x)投影,在查询的返回结果中,只选择必要的字段1.db.collection姓名。find({},{fieldname:1,...})2.参数为字段和值,值为1表示显示,值为0不显示3.特别注意:显示_id列默认情况下,ifNotdisplayed需要显式设置为0,其他不显示的字段不能设置为0db.stu.find({},{_id:0,name:1,gender:1})Sort:db.集合名称.find()。sort({field:1,...})1.参数1为升序2.参数-1为降序3.db.stu.find().sort({score:-1,age:1})统计1.db.collectionname.estimated_document_count()2.db.collectionname.count_documents({condition})去重:db.collectionname.distinct(field,{condition})update:db.collectionname.update({query},{update},{multi:boolean})1.参数query:查询条件2.参数update:更新运算符3.参数multi:可选,默认为false,表示只更新找到的第一项数据,值为true表示更新所有满足条件的数据。multi参数必须和$set一起使用!delete:db.collectionname.remove({query},{justOne:boolean})1.参数query:可选,要删除的文档的条件2.参数justOne:可选,如果设置为true或1,只删除一、默认为false,表示全部删除
