2.0 MongoDB 基本配置及常用命令

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u011418530/article/details/85672991

1,安装MongoDB数据库(windows和Linux环境)

打开官网:https://www.mongodb.com/download-center/community?jmp=nav

选择 自己要下载的版本。

windows安装:

安装与启动

在 D 盘创建安装目录,D:\MongoDB,将解压后的文件拷入新建的文件。

在 D 盘创建一个目录,D:\MongoDB\Server\4.0\Data,用于存放 MongoDB 的数据。

执行安装,使用命令行,进入 MongDB 的安装目录,执行安装命令,并指明存放 MongoDB 的路径。

安装完成后配置 环境变量

启动数据库

注意,如果这是你的目录中有空格,会报 Invalid command 错误,将 dbpath 后面的值加上双引号即可 mongod.exe -dbpath=”D:\MongoDB\Server\4.0\data”。

最后一行显示我们的 MongoDB 已经连接到 27017,它是默认的数据库的端口;它建立完数据库之后,会在我们的 MongoDbData 文件夹下,生成一些文件夹和文件:在 journal 文件夹中会存储相应的数据文件,NoSQL 的 MongoDB,它以文件的形式,也就是说被二进制码转换过的 json 形式来存储所有的数据模型。

启动 MongoDB 数据库,也可以根据自己配置 mongodb.bat 文件,在 D:\MongoDB\Server\4.0\bin 中创建一个 mongodb.bat 文件,然后我们来编写这个可执行文件如下:

mongod --dbpath=D:\MongoDB\Server\4.0\data

运行 mongodb.bat 文件,MongoDB 便启动成功!

想要客户端界面操作可以安装 RoboMongo 客户端

Linux安装:

Mongo数据库Linux安装:

1,上传到linux

2,tar -zxvf mongodb-linux-x86_64-2.6.9.tgz解压

3,进入解压文件夹/bin目录下

4,mkdir mongodata 创建数据文件夹

5,./mongod --dbpath ./mongodata 启动mongoDB

6,重新打开一个窗口cd /opt/local/mongodb-linux-x86_64-2.6.9/bin/

7,./mongo 进入mongo客户端 help是帮助

db.aaa.insert({"a":1,"b":"123"}); 插入一条数据

db.aaa.find(); 查询

db.aaa.find({"b":"123"}); 条件查询

2,MongoDB 常用命令

2.1 创建数据库

use testdb

2.2 创建集合

db.t_member.insert({name:"zhaomin",age:23})

2.3 查询

db.t_member.find()

db.t_member.findOne()

2.4 修改

#不会影响其他属性列 ,主键冲突会报错

db.t_member.update({name:"zhaomin"},{$set:{age:18}})

#第三个参数为 true 则执行 insertOrUpdate 操作,查询出则更新,没查出则插入,

或者

db.t_member.update({name:"zhaomin"},{$set:{age:18}},true)

2.5 删除

#删除满足条件的第一条 只删除数据 不删除索引

db.t_member.remove({age:1})

#删除集合

db.t_member.drop();

#删除数据库

db.dropDatabase();

2.6 查看集合

show collections

2.7 查看数据库

show dbs

2.8 插入数据

db.t_member.insert() #不允许键值重复

db.t_member.save() #若键值重复,可改为插入操作

2.9 批量更新

db.t_member.update({name:"zhaomin"},{$set:{name:"zhanmin11"}},false,true);

批量操作需要和选择器同时使用,第一个 false 表示不执行 insertOrUpdate 操作,第二个 true 表示执行批量

2.10 更新器使用

$set : 指定一个键值对,若存在就进行修改,不存在则添加

$inc :只使用于数字类型,可以为指定键值对的数字类型进行加减操作:

db.t_member.update({name:"zhangsan"},{$inc:{age:2}})

执行结果是名字叫“zhangsan”的年龄加了 2

$unset : 删除指定的键

db.t_member.update({name:"zhangsan"},{$unset:{age:1}})

$push : 数组键操作:1、如果存在指定的数组,则为其添加值;2、如果不存在指定的数组,则创建数组键,并添加值;3、如果指定的键不为数组类型,则报错;

$addToSet : 当指定的数组中有这个值时,不插入,反之插入

#则不会添加到数组里

db.t_member.update({name:"zhangsan"},{$addToSet:{classes:"English"}});

$pop:删除指定数组的值,当 value=1 删除最后一个值,当 value=-1 删除第一个值

#删除了最后一个值

db.t_member.update({name:"zhangsan"},{$pop:{classes:1}})

$pull : 删除指定数组指定的值

#$pullAll 批量删除指定数组

db.persons.update({name:"zhangsan"},{$pull:{classes:"Chinese"}})

#若数组中有多个 Chinese,则全删除

db.t_member.update({name:"zhangsan"},{$pull:{classes:["Chinese"]}})

$ : 修改指定数组时,若数组有多个对象,但只想修改其中一些,则需要定位器:

db.t_member.update({"classes.type":"AA"},{$set:{"classes.$.sex":"male"}})

$addToSet 与 $each 结合完成批量数组更新操作

db.t_member.update({name:"zhangsan"},{$set:{classes:{$each:["chinese","art"]}}})

runCommand 函数和 findAndModify 函数

runCommand({

findAndModify:"persons",

query:{查询器},

sort:{排序},

update:{修改器},

new:true 是否返回修改后的数据

});

runCommand 函数可执行 mongdb 中的特殊函数

findAndModify 就是特殊函数之一,用于返回执行返回 update 或 remove 后的文档

例如:

db.runCommand({

findAndModify:"persons",

query:{name:"zhangsan"},

update:{$set:{name:"lisi"}},

new:true

})

2.11 高级查询详解

db.t_member.find({},{_id:0,name:1})

第一个空括号表示查询全部数据,第二个括号中值为 0 表示不返回,值为 1 表示返回,默认情况下若不

指定主键,主键总是会被返回;

db.persons.find({条件},{指定键});

比较操作符:$lt: < $lte: <= $gt: > $gte: >= $ne: !=

2.11.1、查询条件

#查询年龄大于等于 25 小于等于 27 的人

db.t_member.find({age:{$gte:25,$lte:27}},{_id:0,name:1,age:1})

#查询出所有国籍不是韩国的人的数学成绩

db.t_member.find({country:{$ne:"韩国"}},{_id:0,name:1,country:1})

2.11.2、包含与不包含(仅针对于数组)

$in 或 $nin

#查询国籍是中国或美国的学生信息

db.t_member.find({country:{$in:["China","USA"]}},{_id:0,name:1:country:1})

2.11.3、$or 查询

#查询语文成绩大于 85 或者英语大于 90 的学生信息

db.t_member.find({$or:[{c:{$gt:85}},{e:{$gt:90}}]},{_id:0,name:1,c:1,e:1})

#把中国国籍的学生上增加新的键 sex

db.t_member.update({country:"China"},{$set:{sex:"m"}},false,true)

#查询出 sex 为 null 的人

db.t_member.find({sex:{$in:[null]}},{_id:0,name:1,sex:1})

2.11.4、正则表达式

#查询出名字中存在”li”的学生的信息

db.t_member.find({name:/li/i},{_id:0,name:1})

2.11.5、$not 的使用

$not 和$nin 的区别是$not 可以用在任何地方儿$nin 是用到集合上的

#查询出名字中不存在”li”的学生的信息

db.t_member.find({name:{$not:/li/i}},{_id:0,name:1})

2.11.6、$all 与 index 的使用

#查询喜欢看 MONGOD 和 JS 的学生

db.t_member.find({books:{$all:["JS","MONGODB"]}},{_id:0,name:1})

#查询第二本书是 JAVA 的学习信息

db.t_member.find({"books.1":"JAVA"},{_id:0,name:1,books:1})

2.11.7、$size 的使用,不能与比较查询符同时使用

#查询出喜欢的书籍数量是 4 本的学生

db.t_member.find({books:{$size:4}},{_id:0,name:1})

2.11.8、查询出喜欢的书籍数量大于 4 本的学生本的学生

1)增加 size 键

db.t_member.update({},{$set:{size:4}},false,true)

2)添加书籍,同时更新 size

db.t_member.update({name:"jim"},{$push:{books:"ORACL"},$inc:{size:1}})

3)查询大于 3 本的

db.t_member.find({size:{$gt:4}},{_id:0,name:1,size:1})

2.11.9、$slice 操作符返回文档中指定数组的内部值

#查询出 Jim 书架中第 2~4 本书

db.t_member.find({name:"jim"},{_id:0,name:1,books:{$slice:[1,3]}})

#查询出最后一本书

db.t_member.find({name:"jim"},{_id:0,name:1,books:{$slice:-1}})

2.11.10、文档查询

查询出在 K 上过学且成绩为 A 的学生

1)绝对查询,顺序和键个数要完全符合

db.t_member.find({school:{school:"K","score":"A"}},{_id:0,name:1})

2)对象方式,但是会出错,多个条件可能会去多个对象查询

db.t_member.find({"school.school":"K","school.score":"A"},{_id:0,name:1})

正确做法单条条件组查询$elemMatch

db.t_member.find({school:{$elemMatch:{school:"K",score:"A"}},{_id:0,name:1})

db.t_member.find({age:{$gt:22},books:"C++",school:"K"},{_id:0,name:1,age:1,books:1,school:1})

2.11.11、分页与排序

1)limit 返回指定条数 查询出 persons 文档中前 5 条数据:

db.t_member.find({},{_id:0,name:1}).limit(5)

2)指定数据跨度 查询出 persons 文档中第 3 条数据后的 5 条数据

db.t_member.find({},{_id:0,name:1}).limit(5).skip(3)

3)sort 排序 1 为正序,-1 为倒序

db.t_member.find({},{_id:0,name:1,age:1}).limit(5).skip(3).sort({age:1})

注意:mongodb 的 key 可以存不同类型的数据排序就也有优先级

最小值->null->数字->字符串->对象/文档->数组->二进制->对象 ID->布尔->日期->时间戳->正则->最大值

2.11.12、游标

利用游标遍历查询数据

var persons = db.persons.find();

while(persons.hasNext()){

obj = persons.next();

print(obj.name)

}

游标几个销毁条件

1).客户端发来信息叫他销毁

2).游标迭代完毕

3).默认游标超过 10 分钟没用也会别清除

2.11.13、查询快照

快照后就会针对不变的集合进行游标运动了,看看使用方法.

#用快照则需要用高级查询

db.persons.find({$query:{name:”Jim”},$snapshot:true})

高级查询选项

1)$query

2)$orderby

3)$maxsan:integer 最多扫描的文档数

4)$min:doc 查询开始

5)$max:doc 查询结束

6)$hint:doc 使用哪个索引

7)$explain:boolean 统计

8)$snapshot:boolean 一致快照

2.11.14.1、查询点(70,180)最近的 3 个点

db.map.find({gis:{$near:[70,180]}},{_id:0,gis:1}).limit(3)

2.11.14.2、查询以点(50,50)和点(190,190)为对角线的正方形中的所有的点

db.map.find({gis:{$within:{$box:[[50,50],[190,190]]}}},{_id:0,gis:1})

2.11.14.3、查询出以圆心为(56,80)半径为 50 规则下的圆心面积中的点

db.map.find({gis:{$with:{$center:[[56,80],50]}}},{_id:0,gis:1})

2.11.15、Count+Distinct+Group

2.11.15.1、count 查询结果条数

db.persons.find({country:"USA"}).count()

2.11.15.2、Distinct 去重

请查询出 persons 中一共有多少个国家分别是什么

#key 表示去重的键

db.runCommand({distinct:"persons",key:"country"}).values

2.11.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:{m:0},

$reduce:function(doc,prev){

if(doc.m>prev.m){

prev.m = doc.m;

prev.name = doc.m;

prev.country = doc.country;

}

},

condition:{m:{$gt:90}},

finalize:function(prev){

prev.m = prev.name+" comes from "+prev.country+" ,Math score is"+prev.m;

}

}

})

2.11.15.4.函数格式化分组键

如果集合中出现键 Counrty 和 counTry 同时存在

$keyf:function(doc){

if(doc.country){

return {country:doc.country}

}

return {country:doc.counTry}

}

2.11.16、常用命令举例

2.11.16.1、查询服务器版本号和主机操作系统

db.runCommand({buildInfo:1})

2.11.16.2、查询执行集合的详细信息,大小,空间,索引等

db.runCommand({collStats:"persons"})

2.11.16.3、查看操作本集合最后一次错误信息

db.runCommand({getLastError:"persons"})

2.11.17、固定集合

2.11.17.1、特性

固定集合默认是没有索引的就算是_id 也是没有索引的

由于不需分配新的空间他的插入速度是非常快的

固定集合的顺是确定的导致查询速度是非常快的

最适合就是日志管理

2.11.17.2、创建固定集合

创建一个新的固定集合要求大小是 100 个字节,可以存储文档 10 个

db.createCollection("mycoll",{size:100,capped:true,max:10})

把一个普通集合转换成固定集合

db.runCommand({convertToCapped:"persons",size:1000})

2.11.17.3、对固定集合反向排序,默认情况是插入的顺序排序

db.mycoll.find().sort({$natural:-1})

猜你喜欢

转载自blog.csdn.net/u011418530/article/details/85672991
今日推荐