凡是过往,皆为序章

0%

MongoDB_01

今天安装了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
2
3
4
5
6
7
8
9
10
11
port=27017 #端口
dbpath= /usr/mongodb/mongodb-4.0.10/db #数据库存文件存放目录
logpath= /usr/mongodb/mongodb-4.0.10/log/mongodb.log #日志文件存放路径
logappend=true #使用追加的方式写日志
fork=true #以守护进程的方式运行,创建服务器进程
maxConns=100 #最大同时连接数
noauth=true #不启用验证
journal=true #每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#即使宕机,启动时wiredtiger会先将数据恢复到最近一次的checkpoint点,然后重放后续的journal日志来恢复。
storageEngine=wiredTiger #存储引擎,有mmapv1、wiretiger、mongorocks
bind_ip=0.0.0.0 #设置成全部ip可以访问,这样就可以在windows中去连虚拟机的MongoDB,也可以设置成某个网段或者某个p1234567891011

然后创建数据库和日志相应的文件夹。

1
2
3
4
mkdir db # 数据库目录
mkdir log # 日志目录
cd log/
touch mongodb.log

然后在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
2
3
# 在test数据库的c1集合中插入数据,并且 键 统一不加引号
use test
db.c1.insert({uname:'zhangsan', age = 18})

通过 db.集合名.find() 查看该集合内的数据

其中,mongoDB会给每条数据增加一个全球唯一的 _id 键。

注意

  1. 可以自定义 _id 值,只需要给插入的JSON数据增加 _id 键即可覆盖 (但强烈不推荐)

  2. 一次性插入多条数据?

    1
    2
    3
    4
    5
    db.c1.insert([
    {uname:"lisi", age=19},
    {uname:"lisi2", age=29},
    {uname:"lisi3", age=39}
    ])
  3. 插入多条数据

    mongoDB底层使用JS引擎实现的,所以支持部分JS语法

    1
    2
    3
    4
    5
    6
    7
    for (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
2
3
db.c1.remove({}, true) # 删除一条数据

db.c1.remove({}) # 删除c1下所有数据

基础语法:db.集合名.update(条件,新数据 [, 是否新增,是否修改多条])

是否新增:指条件匹配不到数据则插入(true是插入,false 不插入,默认)

是否修改多条:指将匹配成功的数据都修改(true 是,false 不是 默认)

升级语法:

1
2
3
db.集合名.update(条件,新数据)

新数据格式:{修改器: {键:值}}

修改器表

修改器 作用
$inc 递增
$rename 重命名列
$set 修改列值
$unset 删除列

案例:

假设表中有数据,uname:"zhangsan", age=19 ,修改uname为lisi。

1
2
3
4
5
6
7
db.c1.update({uname:"zhangsan"},{uname:"lisi"})
# 会发现age列不见,则默认语法实则为替换,而不是修改

db.c1.update({uname:"zhangsan"},{$set:{uname:"lisi"}}) # 修改成功

# 若修改多级(score.Math), 则必须加引号
db.student.update({name:"lisi"},{$set:{"score.Math":95}})

练习:给{uname;”zhangsan”} 的年龄 +2 或 -2

1
2
db.c1.update({uname:"a10"},{$inc:{age:2}})
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
2
3
4
5
6
7
8
9
10
11
db.c4.update({uname:"神龙教主"},{$set:{uname:"飞天教主"}})
{$inc:{age:111}}
{$rename:{who:"sex"}}
{$unset:{other:true}}

db.c4.update({uname:"神龙教主"},{
$set:{uname:"飞天教主"},
$inc:{age:111},
$rename:{who:"sex"},
$unset:{other:true}
})

基础语法:db.集合名.find(条件 [,查询的列])

1
2
3
4
5
6
7
8
9
10
条件
查询所有数据 {}
查询age=6的数据 {age:6}
既要age=6又要性别=男 {age:6,sex:'男'}

查询的列(可选参数)
不写则查询所有字段
{age:1} 只显示age列
{age:0} 除了age列都显示
注意:不管怎么写,_id 字段都会在

高级语法

1
2
3
db.集合名.find({
键:{运算符:值}
})

运算符表:

运算符 作用
$gt 大于
$gte 大于等于
$lt 小于
$lte 小于等于
$ne 不等于
$in in
$nin not in

例子:

1
2
3
4
5
6
7
8
# 查询c1集合下所有的uname
db.c1.find({},{uname:1})

# 查询年龄大于5岁的数据
db.c1.find({age: {$gt:5}})

# 查询年龄是5岁、8岁、10岁的数据
db.c1.find({age:{$in:[5,8,10]}}) # 集合里

四、JAVA API

~感谢你请我吃糖果~
-------------本文结束,感谢您的阅读,欢迎评论留言!-------------