当前位置: 首页 > 科技观察

一篇文章带你了解非关系型数据库MongoDB

时间:2023-03-17 01:12:13 科技观察

愿人长寿,万里同乐。大家好,我是黄伟。今天给大家介绍一下Mango数据库,一起来看看吧。前言Mongodb是一个分布式文档存储数据库,用C++语言编写,旨在为WEB应用程序提供可扩展的高性能数据存储解决方案。MongoDB是一个高性能、开源、无模式的文档数据库,是比较流行的NoSql数据库之一。它可以在许多场景中用作传统关系数据库或键/值存储的替代方案。下面说说它的具体用法。一、安装与配置1、下载下载地址如下:https://590m.com/file/7715018-442253530然后点击msi安装文件进行安装。由于比较大,建议不要安装在C盘,选择下图的选项即可。.这里我选择的是E:\mongodb,按步骤操作,总体还是比较简单的,唯一需要注意的是有个选项不能勾选,如下图:2.创建配置文件E:\mongodb\data\log目录用于存放日志文件;在E:\mongodb\data\log目录下新建mongodb.log,用于存放日志信息;创建E:\mongodb\data\db目录存放数据库数据;并在E:\mongodb目录下创建mongo.config,在文件里面复制如下内容:#datafilehere=对应数据存放目录dbpath=E:\mongodb\data\db#logfilehere=对应到日志文件所在路径logpath=E:\mongodb\data\log\mongodb.log#错误日志采用append方式。配置这个选项后,mongodb的日志会追加到已有的日志文件中,而不是新建文件logappend=true#启用日志文件,默认启用journal=true#过滤掉一些无用的日志信息,如果需要调试,请设置为falsequiet=true#默认端口号为27017port=270173。配置环境变量4.创建数据库文件存放位置进入命令提示符,输入以下命令:mongod.exe--dbpathE:\mongodb\data\db--dbpath为创建的数据库文件存放位置,mongo需要确认目录所在位置5.验证是否可以正常访问我们在浏览器中输入如下网址:http://localhost:27017/如图:浏览器返回这样一串英文,意思是mongodb数据库启动成功。但是这样每次都启动太麻烦了,我们可以把它添加到系统任务中,让它自动启动。6.安装日志文件和服务名称C:\Users\Administrator>mongod.exe--dbpathE:\mongodb\data\db-logpathE:\mongodb\data\log\mongodb.log-install-serviceName"MongoDB"如果是显示已经存在,如图:然后,先删除服务:scdeleteMongoDB再次输入之前的命令。7.启动mongodb然后我们启动它:netstartMongoDB可以看到启动成功了,好不容易。关闭mongodb服务:netstopMongoDB2.对mongodb的数据库进行增删改查众所周知,mongodb没有表的概念,存储都是靠集合来完成的,所以我们需要创建的是集合。下面我们就来看看mongodb最常见的数据库操作。首先打开命令提示符,输入如下命令进入环境://createdatabaseusedata//显示所有数据库showdbsshowdatabases//查看当前数据库dbdb.getName()//删除当前数据库db.dropDatabase()//修复当前数据库db.repairDatabase()//从指定机器复制指定数据库数据到数据库db.copyDatabase("my_db","you_db","127.0.0.1")//从Clone上的数据库指定主机db.cloneDatabase("127.0.0.1")//创建一个集合,集合大小固定为100,最大值为1000db.createCollection('student',{capped:true,size:100,max:1000})//Showallcollectionsshowcollections//获取当前db的所有collection集合db.getCollectionNames()//显示当前db的所有collection索引状态db.printCollectionStats()//删除collectiondb.hw.drop()//获取指定名称的聚合集合db.getCollection("hw")//如果插入集合ex的_idists,会报错db.hw.insert({_id:0001,'name':'hw','age':10})//显示集合的内容db.hw.find()//显示一个集合内容db.hw.findOne()//格式化并显示集合内容db.hw.find().pretty()//保存集合_id并更新db.hw.save({_id:0001,'name':'hw','age':10})//更新集合$set指定key,不存在则更新,create$unsetdeletedb.hw.update({'name':'hw'},{'name':'xz'})//更新一个数据替换db.hw.update({'name':'hw'},{$set{'name':'xz'}})//更新一次数据更新db.hw.update({'name':'hw'},{'name':'xz'},{multi:true})//更新所有data//删除集合数据db.hw.remove({'name':'hw'},{justOne:true})//删除一条数据db.hw.remove({'name':'hw'},{justOne:false})//删除所有数据//集合重命名db.user.renameCollection("hw");renameusertohw//查询数据$lt--小于$lte--小于等于$gt--大于$gte--大于等于$ne--不等于$in$nin--是否在此范围内$where查询函数_id默认显示,如果不显示,设置值为0sort()排序,参数为1升序-1降序count()统计查询结果的个数也可以放入查询参数的计数distinct()消除重复数据db.hw.find({age:{$gte:18}})db.hw.find({age:{$in:[12,32,21]}})db.hw.find({$and:{age:{$in:[12,32,21]},{age:{$gte:18}}}})db.hw.find({age:{$gte:18}}).skip(3).limit(2)db.hw.find({age:/^abc/,name:{$regex:'123$'}})db.hw.find($where:function(){returnthis.age<=19})db.hw.find({age:{$gte:18}}).sort({age:1})db.hw.distinct({age:{$gte:18}})3.索引//创建唯一值索引db.hw.ensureIndex({name:1},{'unique':true})//1升序-1降序db.hw.find({name:'he'}).explain('executionStats')//获取时间//查看集合中的所有索引db.hw.getIndexes()//删除索引db.hw.dropIndex('name')//重建索引db.hw.reIndex()4.数据聚合//数据聚合$group分组$match过滤数据$project修改文档结构$sort排序$limit指定数量$skipskip$unwind拆分数组类型字段$pushAll$sum和$avg平均值$push向数组添加值$pop$addToSet$pull$rename$bit$首先开始$最后结束$min$maxdb.hw.aggregate({$group:{_id:'$name',count:{$sum:1},avg_age:{$avg:'$age'}}},{$project:{name:'$_id',count:'$count',avg_age:'$avg_age'}},{$match:{age:{$gt:20}}},{$unwind:{'$age',preserveNullAndEmptyArrays:true}}//true保留缺失值)5.数据备份与恢复//备份数据mongodump-hdbhost-ddbname-odbdirectory-h服务器地址-d待备份的数据库名-o备份数据库存放位置//数据恢复mongorestore-hdbhost-ddbname--dirdbdirectory-h服务器地址-d待恢复数据库实例--dir备份数据的位置六、数据监控//监控Mongostat检测数据库状态mongotopsleeptime--锁跟踪一个MongoDB例7、高级查询<,>,>=,<=这四个不用解释,最最常用最简单的db.collection.find({"field":{$gt:value}})//大于:field>valuedb.collection.find({"field":{$lt:value}})//小于:field=valuedb.collection.find({"field":{$lte:value}})//小于等于:field<=value如果要同时满足多个条件,记得这样用:db.collection.find({"field":{$gt:value1,$lt:value2}})//value13,即x不等于3,$mod取模运算db.things.find({a:{$mod:[10,1]}})的条件等价于a%10==1,即取余a除以10就是1。$nin不属于db.things.find({j:{$nin:[2,4,6]}})条件相当于j不等于[2,4,6]。$in属于db.things.find({j:{$in:[2,4,6]}})条件相当于j等于[2,4,6]中的任意一个。$allallbelongtodb.things.find({a:{$all:[2,3]}})类似于$in,但是[]的所有值都必须存在。$sizenumber,sizedb.things.find({a:{$size:1}})条件相当于a的取值个数为1(a必须是数组,且取一个值的情况不能将其视为具有数字1)的数组。$exists字段存在db.things.find({a:{$exists:true}})db.things.find({a:{$exists:false}})true返回字段a中存在的数据,而false则返回不存在的数据字段a的数据。如果条件是a类型匹配,$type字段类型db.things.find({a:{$type:2}})返回数据。参数类型如下图所示:TypeNameTypeNumberDouble1String2Object3Array4Binarydata5Objectid7Boolean8Date9Null10Regularexpression11JavaScriptcode13Symbol14JavaScriptcodewithscope1532-bitinteger16Timestamp1764-bitinteger18Minkey255Maxkey127RegularExpressionsRegularexpressionmethodindb.like/customers)issimilar{name:customers)Startofline/^Endofline$/这里要特别注意一点,跟查询效率有关:而/^a/,/^a./,和/^a.$/是等价的,都会用一个索引以同样的方式,后两个需要扫描整个字符串,所以它们会更低。第一种格式可以在前缀匹配后停止扫描。意思大概意思就是搜索以a开头的字符串时,有/^a/、/^a./、/^a.$/三种形式。后两种形式会扫描整个字符串,查询速度会比较慢。第一种形式在找到匹配的开始后将停止扫描后面的字符。所以要特别注意。几个附加参数:i表示忽略大小写。(这个很重要,也很常用)m表示支持多行。(虽然我没试过)x表示扩展。(没用过)$oror(注:MongoDB1.5.3后可用)db.foo.find({$or:[{a:1},{b:2}]})满足条件a=1或数据满足条件b=2的会被查询。用其他字段查询:db.foo.find({name:"bob",$or:[{a:1},{b:2}]})满足name等于bob的条件,满足other两个条件中的任何一个数据。ValueinanArray数组中的值,例如数据库中存在这样的数据:{"_id":ObjectId("4c503405645fa23b31e11631"),"colors":["red","black"]}查询db.things。找到({颜色:“红色”});你可以找到上面的数据。$elemMatch元素满足t.find({x:{$elemMatch:{a:1,b:{$gt:1}}}}):{"_id":ObjectId("4b5783300334000000000aa9"),"x":[{"a":1,"b":3},7,{"b":99},{"a":11}]}X其中一个元素满足检索即可健康)状况。(但是一般谁会用x这样的结构来保存数据呢?)ValueinanEmbeddedObject的嵌入对象中的值,比如数据库中的数据:{"_id":ObjectId("4c503773645fa23b31e11632"),"author":{"name":"DanBrown","age":38},"book":"TheLostSymbol"}查询:db.postings.find({"author.name":"DanBrown"});你可以找到上面的数据。查询嵌入对象的属性,记得加“”,字段是“author.name”,不是author.name。$not不是db.customers.find({name:{$not:/acme.*corp/i}});这是与其他查询条件结合使用的运算符,不会单独使用。只要理解前面的查询操作,只要加上$not,结果就是得到没有$not的相反结果集。sort()排序这个非常有用。即sql语言中的OrderBy。db.myCollection.find().sort({ts:-1})也可以对多个字段进行排序db.myCollection.find().sort({ts:-1,ds:1})其中1代表升序,-1表示降序。经过ME的实验,小于0的数是降序,0以上的数(包括0)是升序。limit()和skip()这两个ME是你实现数据库分页的好帮手。limit()控制返回结果的数量。如果参数为0,则视为无约束,limit()无效。skip()控制返回的结果跳过多少。如果参数为0,则视为无约束,skip()将不起作用,或跳过0项。例如:db.test.find().skip(5).limit(5)结果是取第6到10条数据。snapshot()(没试过)count()返回结果集中的行数。db.test.count()加入skip()和limit()两个操作时,获取实际返回结果的个数,需要一个参数true,否则返回满足查询条件的结果总数。例子如下:>db.test.find().skip(5).limit(5).count()9>db.test.find().skip(5).limit(5).count(true)48.用户操作//添加用户db.addUser("hw")db.addUser("hw","123321",true)#添加用户,设置密码,只读//数据库认证,安全模式Db。auth("hw","123123")//显示当前所有用户showusers//删除用户db.removeUser("hw")9.其他命令//查询指定数据库集合的可用存储空间db.hw.storageSize()//查询集合分配的存储空间db.hw.totalSize()//查看数据库服务器状态db.serverStatus()//查询指定数据库的统计信息db.stats()//当前数据库版本db。version()//查看当前db的链接机器地址db.getMongo()10.可视化工具提高交互为了让我们的操作更加人性化,更加直观的展示操作数据,我们可以使用可视化工具。今天给大家带来的是Navicat-mongo工具,它是Navicat家族中一款只对mongo数据库进行操作的数据库可视化工具。下载地址:https://590m.com/file/7715018-442253555软件原因破解程序简单操作即可破解。下载后按照提示安装,这样就可以基本完成对数据库的操作了,然后大佬们按照命令敲。总结本文从Mongodb安装配置、数据增删改查、索引操作、数据聚合、数据备份恢复、监控、高级查询、用户操作等十个方面介绍Mongodb,一篇文章带你了解MongoDB数据库。