MongoDB(二)

本节介绍安装、命令、客户端。

安装配置

可以结合mongodb(一)来理解。

1,在官网上找到社区版并下载社区版:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.6.5.tgz2,解压3,进入解压目录,观察bin下的执行文件。其中:mongo(改动配置)、mongod(启动数据库)、mongos(配置路由)。4,修改/etc/profile,设置环境变量export MONGO_HOME=/opt/mongodb-linux-x86_64-3.6.5 ,export PATH=$MONGO_HOME/bin:$PATH ,source /etc/profile5,mongo -version检测。6,创建mongodb的数据文件夹: mkdir -p /data/mongodb/data27,简易启动:mongod --dbpath=/data/mongodb/data2(最后一行显示我们的 MongoDB 已经连接到 27017,它是默认的数据库的端口;它建立完数据库之后,会在我们的 /data/mongodb/data2文件夹下,生成一些文件夹和文件:在 journal 文件夹中会存储相应的数据文件,NoSQL 的 MongoDB,它以文件的形式,也就是说被二进制码转换过的 json 形式来存储所有的数据模型。)8,启动mongo客户端连接:>mongo>show dbs 查看9,通过配置启动:这里若是要远程连接,建议新建conf文件夹并且添加mongodb.conf配置文件,编辑该文件:# mongodb.conf# Where to store the data.dbpath=/data/mongodb/data2#whereto loglogpath=/var/log/mongodb/mongodb.loglogappend=truebind_ip=0.0.0.0port=27017# Enable journaling, http://www.mongodb.org/display/DOCS/Journalingjournal=true# Enables periodic logging of CPU utilization and I/O wait#cpu= true# Turn on/off security. Off is currently the default#noauth= true#auth= true# Verbose logging output.#verbose= true# Inspect all client data for validity on receipt (useful for# developing drivers)#objcheck= true# Enable db quota management#quota= true# Set oplogging level where n is# 0=off (default)# 1=W# 2=R# 3=both# 7=W+some reads#oplog= 0# Diagnostic/debugging option#nocursors= true# Ignore query hints#nohints= true# Disable the HTTP interface (Defaults to localhost:27018).#nohttpinterface= true# Turns off server-side scripting. This will result in greatly limited# functionality#noscripting= true# Turns off table scans. Any query that would do a table scan fails.#notablescan= true# Disable data file preallocation.#noprealloc= true# Specify .ns file size for new databases.# nssize = # Accout token for Mongo monitoring server.#mms-token= # Server name for Mongo monitoring server.#mms-name= # Ping interval for Mongo monitoring server.#mms-interval= # Replication Options# in replicated mongo databases, specify here whether this is a slave or master#slave= true#source= master.example.com# Slave only: specify a single database to replicate#only= master.example.com# or#master= true#source= slave.example.com# Address of a server to pair with.#pairwith= # Address of arbiter server.#arbiter= # Automatically resync if slave data is stale#autoresync# Custom size for replication operation log.#oplogSize= # Size limit for in-memory storage of op ids.#opIdMem= # SSL options# Enable SSL on normal ports#sslOnNormalPorts= true# SSL Key file and password#sslPEMKeyFile= /etc/ssl/mongodb.pem#sslPEMKeyPassword= pass10,再重启启动 : nohup mongod -f mongodb.conf &参考文档:https://www.mongodb.com/download-center?jmp=nav#community

常用命令

通过mongodb客户端连接,输入如下命令操作:1、创建数据库use mydatabase2、创建集合db.t_member.insert()3、查询db.t_member.find()db.t_member.findOne()4、修改db.t_member.update(,{$set:}) #不会影响其他属性列 ,主键冲突会报错db.t_member.update(,{$set:},true)#第三个参数为 true则执行 insertOrUpdate 操作,查询出则更新,没查出则插入,或者var p = db.t_member.findOne();db.t_member.update(p,) #会删除其他的属性列5、删除db.t_member.remove() #删除满足条件的第一条 只删除数据 不删除索引#删除集合db.t_member.drop();#删除数据库db.dropDatabase();6、查看集合show collections7、查看数据库show dbs8、插入数据db.t_member.insert() #不允许键值重复db.t_member.save() #若键值重复,可改为插入操作9、批量更新db.t_member.update(,{$set:},false,true);批量操作需要和选择器同时使用,第一个 false 表示不执行 insertOrUpdate 操作,第二个 true 表示执行批量10、更新器使用$set : 指定一个键值对,若存在就进行修改,不存在则添加$inc :只使用于数字类型,可以为指定键值对的数字类型进行加减操作:db.t_member.update(,{$inc:})执行结果是名字叫“zhangsan”的年龄加了 2$unset : 删除指定的键db.t_member.update(,{$unset:})$push : 数组键操作:1、如果存在指定的数组,则为其添加值;2、如果不存在指定的数组,则创建数组键,并添加值;3、如果指定的键不为数组类型,则报错;$pushAll : 批量想数组键插入值db.t_member.update(,{$pushAll:});$addToSet : 当指定的数组中有这个值时,不插入,反之插入db.t_member.update(,{$addToSet:}); #则不会添加到数组里$pop:删除指定数组的值,当 value=1 删除最后一个值,当 value=-1 删除第一个值db.t_member.update(,{$pop:}) #删除了最后一个值$pull : 删除指定数组指定的值db.persons.update(,{$pull:}) #$pullAll 批量删除指定数组db.t_member.update(,{$pull:})#若数组中有多个 Chinese,则全删除$ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:db.t_member.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}})$addToSet 与 $each 结合完成批量数组更新操作db.t_member.update(,{$set:}})11、runCommand 函数和 findAndModify 函数runCommand({findAndModify:"persons",query:,sort:,update:,new:true 是否返回修改后的数据});runCommand 函数可执行 mongdb 中的特殊函数findAndModify 就是特殊函数之一,用于返回执行返回 update 或 remove 后的文档例如:ps=db.runCommand({findAndModify:"persons",query:,update:{$set:},new:true})ps.value12、高级查询详解db.t_member.find({},)第一个空括号表示查询全部数据,第二个括号中值为 0 表示不返回,值为 1 表示返回,默认情况下若不指定主键,主键总是会被返回;db.persons.find(,);比较操作符:$lt: $gte: >= $ne: !=12.1、查询条件db.t_member.find(},)#查询年龄大于等于 25 小于等于 27 的人db.t_member.find(},)#查询出所有国籍不是韩国的人的数学成绩12.2、包含与不包含(仅针对于数组)$in 或 $nindb.t_member.find(},)#查询国籍是中国或美国的学生信息12.3、$or 查询db.t_member.find({$or:[},}]},)#查询语文成绩大于 85 或者英语大于 90 的学生信息db.t_member.update(,{$set:},false,true)#把中国国籍的学生上增加新的键 sexdb.t_member.find(},)#查询出 sex 为 null 的人12.4、正则表达式db. t_member .find(,)#查询出名字中存在”li”的学生的信息12.5、$not 的使用$not 和$nin 的区别是$not 可以用在任何地方儿$nin 是用到集合上的db.t_member.find(},)#查询出名字中不存在”li”的学生的信息12.6、$all 与 index 的使用db.t_member.find(},)#查询喜欢看 MONGOD 和 JS 的学生db.t_member.find({"books.1":"JAVA"},)#查询第二本书是 JAVA 的学习信息12.7、$size 的使用,不能与比较查询符同时使用db.t_member.find(},)#查询出喜欢的书籍数量是 4 本的学生12.8、查询出喜欢的书籍数量大于 4 本的学生本的学生1)增加 size 键db.t_member.update({},{$set:},false,true)2)添加书籍,同时更新 sizedb.t_member.update(,{$push:,$inc:})3)查询大于 3 本的db.t_member.find(},)12.9、$slice 操作符返回文档中指定数组的内部值db.t_member.find(,})#查询出 Jim 书架中第 2~4 本书db.t_member.find(,})#查询出最后一本书12.10、文档查询查询出在 K 上过学且成绩为 A 的学生1)绝对查询,顺序和键个数要完全符合db.t_member.find(},)2)对象方式,但是会出错,多个条件可能会去多个对象查询db.t_member.find({"school.school":"K","school.score":"A"},)3)正确做法单条条件组查询$elemMatchdb.t_member.find(},)db.t_member.find(,books:"C++",school:"K"},)12.11、分页与排序1)limit 返回指定条数 查询出 persons 文档中前 5 条数据:db.t_member.find({},).limit(5)2)指定数据跨度 查询出 persons 文档中第 3 条数据后的 5 条数据db.t_member.find({},).limit(5).skip(3)3)sort 排序 1 为正序,-1 为倒序db.t_member.find({},).limit(5).skip(3).sort()注意:mongodb 的 key 可以存不同类型的数据排序就也有优先级最小值->null->数字->字符串->对象/文档->数组->二进制->对象 ID->布尔->日期->时间戳->正则->最大值12.12、游标利用游标遍历查询数据var persons = db.persons.find();while(persons.hasNext()){obj = persons.next();print(obj.name)}游标几个销毁条件1).客户端发来信息叫他销毁2).游标迭代完毕3).默认游标超过 10 分钟没用也会别清除12.13、查询快照快照后就会针对不变的集合进行游标运动了,看看使用方法.db.persons.find({$query:,$snapshot:true})#用快照则需要用高级查询高级查询选项1)$query2)$orderby3)$maxsan:integer 最多扫描的文档数4)$min:doc 查询开始5)$max:doc 查询结束6)$hint:doc 使用哪个索引7)$explain:boolean 统计8)$snapshot:boolean 一致快照14.1、查询点(70,180)最近的 3 个点db.map.find(},).limit(3)14.2、查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点db.map.find(}},)14.3、查询出以圆心为(56,80)半径为 50 规则下的圆心面积中的点db.map.find(}},)15、Count+Distinct+Group15.1、count 查询结果条数db.persons.find().count()15.2、Distinct 去重请查询出 persons 中一共有多少个国家分别是什么db.runCommand().values#key 表示去重的键15.3、group 分组db.runCommand({ group:{ns:"集合的名字",key:"分组键对象",initial:"初始化累加器",$reduce:"分解器",condition:"条件",finalize:"组完成器"}})分组首先会按照 key 进行分组,每组的 每一个文档全要执行$reduce 的方法,他接收 2 个参数一个是组内本条记录,一个是累加器数据.请查出 persons 中每个国家学生数学成绩最好的学生信息(必须在 90 以上)db.runCommand({group:{ns:"persons",key:{"country":true},initial:,$reduce:function(doc,prev){if(doc.m>prev.m){prev.m = doc.m;prev.name = doc.m;prev.country = doc.country;}},condition:},finalize:function(prev){prev.m = prev.name+" comes from "+prev.country+" ,Math score is "+prev.m;}}})15.4.函数格式化分组键如果集合中出现键 Counrty 和 counTry 同时存在$keyf:function(doc){if(doc.country){return}return}16、常用命令举例16.1、查询服务器版本号和主机操作系统db.runCommand()16.2、查询执行集合的详细信息,大小,空间,索引等db.runCommand()16.3、查看操作本集合最后一次错误信息db.runCommand()17、固定集合17.1、特性固定集合默认是没有索引的就算是_id 也是没有索引的由于不需分配新的空间他的插入速度是非常快的固定集合的顺是确定的导致查询速度是非常快的最适合就是日志管理17.2、创建固定集合创建一个新的固定集合要求大小是 100 个字节,可以存储文档 10 个db.createCollection("mycoll",)把一个普通集合转换成固定集合db.runCommand()17.3、对固定集合反向排序,默认情况是插入的顺序排序db.mycoll.find().sort({$natural:-1})

客户端

可以使用mongovue、Studio 3T等工具连接。如上图,这里使用Studio 3T客户端连接。可以通过如下链接下载客户端:https://studio3t.com/download

支持mongodb的ORM框架

1,http://mongodb.github.io/morphia/2,https://projects.spring.io/spring-data-mongodb/注意要添加mongodb的驱动包:org.mongodbmongo-java-driver3.7.1

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180603G1DVO200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券