今天安装了mongoDB,记录一下。
一、MongoDB centos7安装
首先在官网下载安装包,我这里选择的是RedHat,Linux, 得到的安装包为 :mongodb-linux-x86_64-rhel70-3.6.20.tgz。上传到虚拟机解压。
重命名:mv mongodb-linux-x86_64-rhel70-4.0.10 mongodb-4.0.101。
然后进行如下配置即可。
首先配置环境变量:(似乎,不配也可以?)
1 | vi /etc/profile |
在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容:
1 | export PATH=/usr/mongodb/mongodb-4.0.10/bin:$PATH |
然后在mongoDB的根目录下创建配置文件:touch mongodb.conf。
填写如下内容
1 | port=27017 #端口 |
然后创建数据库和日志相应的文件夹。
1 | mkdir db # 数据库目录 |
然后在bin目录下使用命令:
mongod –config ../mongodb.conf 开启服务。
之后可以在本地navicate测试连接。
二、MongoDB概念解析
基本概念
在mongodb中基本的概念是文档、集合、数据库,如下表:
SQL术语/概念 | MongoDB术语/概念 | 解释/说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
具体如下图:
特点
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
(8)支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++语言的驱动程序,社区中也提供了对Erlang及.NET等平台的驱动程序
(9)文件存储格式为BSON(一种JSON的扩展)
基本数据类型
null:用于表示空值或者不存在的字段,{““x”:null}
布尔型:布尔类型有两个值true和false,{“x”:true}
数值: shell默认使用64位浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong (8字节符号整数),”×”:NumberInt(“3’”))X”x”:NumberLong(“3”))
字符串:UTF-8字符串都可以表示为字符串类型的数据,”×”:“呵呵”
日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{ “x” : new Date() }
正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,”x”:/[abc]/} (正则表达式写在两个斜杠之间)
数组:数据列表或数据集可以表示为数组,{X”:[“a”,”b”,”c”]}
内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”;{“y”:3 }}
对象ld:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectld() }
二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-字符保存到数据库中,二进制数据是唯一的方式。
代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}}
三、Shell命令
基本命令
查看数据库:show dbs
选择 / 创建 数据库 : use 数据库名
(隐式创建:在mongoDB中选择不存在的数据库时不会报错,后期当该数据库有数据时,系统自动创建)
查看集合:show collections
创建集合:db.createCollection(‘集合名’) 。注:后期插入数据时隐式创建集合
删除集合:db.集合名.drop()
删除数据库:通过use语法选中数据库,通过db.dropDatabase()删除数据库。
数据操作
增
语法:db.集合名.insert(JSON数据)
1 | # 在test数据库的c1集合中插入数据,并且 键 统一不加引号 |
通过 db.集合名.find() 查看该集合内的数据
其中,mongoDB会给每条数据增加一个全球唯一的 _id 键。
注意
可以自定义 _id 值,只需要给插入的JSON数据增加 _id 键即可覆盖 (但强烈不推荐)
一次性插入多条数据?
1
2
3
4
5db.c1.insert([
{uname:"lisi", age=19},
{uname:"lisi2", age=29},
{uname:"lisi3", age=39}
])插入多条数据
mongoDB底层使用JS引擎实现的,所以支持部分JS语法
1
2
3
4
5
6
7for (var i = 1; i <= 10; i++) print(i)
需求:在test中c1集合插入十条数据
use test
for (var i = 1; i <= 10; i++){
db.c1.insert({uname: "a" + i, age : i})
}for 循环是一条一条插入数据的,前九条数据的提示没有显示,只显示最后一条的提示信息。
删
语法:db.集合名.remove(条件 [,是否删除一条])
注意:是否删除一条,true 是,false,否 默认
1 | db.c1.remove({}, true) # 删除一条数据 |
改
基础语法:db.集合名.update(条件,新数据 [, 是否新增,是否修改多条])
是否新增:指条件匹配不到数据则插入(true是插入,false 不插入,默认)
是否修改多条:指将匹配成功的数据都修改(true 是,false 不是 默认)
升级语法:
1 | db.集合名.update(条件,新数据) |
修改器表
修改器 | 作用 |
---|---|
$inc | 递增 |
$rename | 重命名列 |
$set | 修改列值 |
$unset | 删除列 |
案例:
假设表中有数据,uname:"zhangsan", age=19
,修改uname为lisi。
1 | db.c1.update({uname:"zhangsan"},{uname:"lisi"}) |
练习:给{uname;”zhangsan”} 的年龄 +2 或 -2
1 | db.c1.update({uname:"a10"},{$inc:{age:2}}) |
综合案例:
插入数据:db.c4.insert({uname:”神龙教主”,age:888,who:”男”,other:”非国人”})
完成需求:
uname 改为 ”飞天教主“ (修改器:$set)
age 增加 111 (修改器:$inc)
who 改字段名 sex (修改器:rename)
other 字段删除 (修改器:$unset)
那么我们如何一次性写多个修改器呢?
1 | db.c4.update({uname:"神龙教主"},{$set:{uname:"飞天教主"}}) |
查
基础语法:db.集合名.find(条件 [,查询的列])
1 | 条件 |
高级语法:
1 | db.集合名.find({ |
运算符表:
运算符 | 作用 |
---|---|
$gt | 大于 |
$gte | 大于等于 |
$lt | 小于 |
$lte | 小于等于 |
$ne | 不等于 |
$in | in |
$nin | not in |
例子:
1 | # 查询c1集合下所有的uname |