<>普及MongoDB一些知识
默认监听端口号 27017/28017
进程名 mongod mongo
数据传输协议 TCP
数据库目录 /data/db
服务名 mongodb
<>一、软件安装
<>1) 下载完安装包,并解压 tgz(以下演示的是 64 位 Linux上的安装)
liuys@ubuntu:~$ sudo wget
https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz --2018-01-31
18:31:39-- https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz
Resolving fastdl.mongodb.org (fastdl.mongodb.org)... 54.192.212.129,
54.192.212.164, 54.192.212.115, ... Connecting to fastdl.mongodb.org
(fastdl.mongodb.org)|54.192.212.129|:443... failed: Connection refused.
Connecting to fastdl.mongodb.org (fastdl.mongodb.org)|54.192.212.164|:443...
connected. HTTP request sent, awaiting response... 200 OK Length: 40282490
(38M) [application/x-gzip] Saving to:‘mongodb-linux-x86_64-3.0.6.tgz’
mongodb-linux-x86_64-3.0.6.tgz
100%[====================================================>] 38.42M 45.8KB/sin
9m 52s 2018-01-31 18:41:54 (66.5 KB/s) -‘mongodb-linux-x86_64-3.0.6.tgz’ saved
[40282490/40282490]
<>2) 解压软件包
liuys@ubuntu:~$ sudo tar -xf /opt/mongodb-linux-x86_64-3.0.6.tgz
<>3) 将解压包拷贝到指定目录
liuys@ubuntu:~$ sudo mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb **
MongoDB的可执行文件位于 bin 目录下,所以可以将其添加到 PATH 路径中: liuys@ubuntu:~$ sudo export
PATH=/usr/local/mongodb/bin:$PATH
<>二、创建数据库目录
<>1)
MongoDB的数据存储在data目录的db目录下,但是这个目录在安装过程不会自动创建,所以你需要手动创建data目录,并在data目录中创建db目录。
** 以下实例中我们将data目录创建于根目录下(/)。
** 注意:/data/db 是 MongoDB 默认的启动的数据库路径(--dbpath)。
liuys@ubuntu:~$ mkdir -p /data/db liuys@ubuntu:~$ sudo cd /usr/local
/mongodb/bin/ liuys@ubuntu:~$ sudo ./mongod 2018-02-01T10:45:49.238+0800 I
STORAGE [initandlisten] 2018-02-01T10:45:49.238+0800 I STORAGE [initandlisten]
** WARNING: Readaheadfor /data/db is set to 4096KB 2018-02-01T10:45:49.238+0800
I STORAGE [initandlisten] ** We suggest setting it to 256KB (512 sectors) or
less 2018-02-01T10:45:49.238+0800 I STORAGE [initandlisten] **
http://dochub.mongodb.org/core/readahead 2018-02-01T10:45:49.238+0800 I JOURNAL
[initandlisten] journal dir=/data/db/journal 2018-02-01T10:45:49.238+0800 I
JOURNAL [initandlisten] recover : no journal files present, no recovery needed
2018-02-01T10:45:49.277+0800 I JOURNAL [durability] Durability thread started
。。。。。。。
<>三、命令行中运行 MongoDB 服务
<>1) 你可以再命令行中执行mongo安装目录中的bin目录执行mongod命令来启动mongdb服务
liuys@ubuntu:~$ sudo ./mongo MongoDB shell version: 3.0.6 connecting to: test
Welcome to the MongoDB shell.。。。。。。。
<>2) MongoDB后台管理 Shell
** 如果你需要进入MongoDB后台管理,你需要先打开mongodb装目录的下的bin目录,然后执行mongo命令文件。
** MongoDB Shell是MongoDB自带的交互式Javascript shell,用来对MongoDB进行操作和管理的交互式环境。
** 当你进入mongoDB后台后,它默认会链接到 test 文档(数据库):
liuys@ubuntu:~$ sudo cd /usr/local/mongodb/bin liuys@ubuntu:~$ sudo ./mongo
MongoDB shell version: 3.0.6 connecting to:test Welcome to the MongoDB shell. ……
<>3) 由于它是一个JavaScript shell,您可以运行一些简单的算术运算:
> 2+2 4 > 3+6 9
<>4) 现在让我们插入一些简单的数据,并对插入的数据进行检索:
> db.runoob.insert({x:10}) WriteResult({ "nInserted" : 1 }) > db.runoob.find()
{"_id" : ObjectId("5a7280e615a8f7a4cd7bf532"), "x" : 10 } 第一个命令将数字 10 插入到 runoob
集合的 x 字段中。
<>四、MongoDb web 用户界面
<>1) MongoDB 提供了简单的 HTTP 用户界面。
** 如果你想启用该功能,需要在启动的时候指定参数 --rest
liuys@ubuntu:~$ sudo ./mongod --dbpath=/data/db --rest
2018-02-01T10:54:06.272+0800 I CONTROL ** WARNING: --rest is specified without
--httpinterface, 2018-02-01T10:54:06.272+0800 I CONTROL ** enabling http
interface 2018-02-01T10:54:06.336+0800 I STORAGE [initandlisten]
*** MongoDB 的 Web 界面访问端口比服务的端口多1000。
<>2) 如果你的MongoDB运行端口使用默认的27017,你可以在端口号为28017访问web用户界面,即地址为:
http://localhost:28017 <http://localhost:28017/>
所有的增加的命令
<>五、mongoDB的连接
<>1) 使用默认端口来连接 MongoDB 的服务。
> mongodb://localhost
*** 通过 shell 连接 MongoDB 服务:
liuys@ubuntu:~$ sudo ./mongo MongoDB shell version: 3.0.6 connecting to: test
...
*** 这时候你返回查看运行 ./mongod 命令的窗口,可以看到是从哪里连接到MongoDB的服务器,您可以看到如下信息:
……省略信息…… 2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] allocator:
tcmalloc 2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] options: {
storage: { dbPath:"/data/db" } } 2015-09-25T17:22:27.350+0800 I NETWORK
[initandlisten] waitingfor connections on port 27017
2015-09-25T17:22:36.012+0800 I NETWORK [initandlisten] connection accepted from
127.0.0.1:37310#1 (1 connection now open) # 该行表明一个来自本机的连接 ……省略信息……
<>2) MongoDB 连接命令格式
** 使用用户名和密码连接到 MongoDB 服务器,你必须使用 'username:password@hostname/dbname'
格式,'username'为用户名,'password' 为密码。
** 使用用户名和密码连接登陆到默认数据库:
liuys@ubuntu:~$ sudo ./mongo MongoDB shell version: 3.0.6 connecting to: test
** 使用用户 admin 使用密码 123456 连接到本地的 MongoDB 服务上。输出结果如下所示:
> mongodb://admin:123456@localhost/ ...
** 使用用户名和密码连接登陆到指定数据库,格式如下:
> mongodb://admin:123456@localhost/test
** 更多连接实例 ** 连接本地数据库服务器,端口是默认的。
> mongodb://localhost
** 使用用户名fred,密码foobar登录localhost的admin数据库。
> mongodb://fred:foobar@localhost
** 使用用户名fred,密码foobar登录localhost的baz数据库。
> mongodb://fred:foobar@localhost/baz
** 连接 replica pair, 服务器1为example1.com服务器2为example2。
> mongodb://example1.com:27017,example2.com:27017
** 连接 replica set 三台服务器 (端口 27017, 27018, 和27019):
> mongodb://localhost,localhost:27018,localhost:27019
** 连接 replica set 三台服务器, 写入操作应用在主服务器 并且分布查询到从服务器。
> mongodb://host1,host2,host3/?slaveOk=true
** 直接连接第一个服务器,无论是replica set一部分或者主服务器或者从服务器。
> mongodb://host1,host2,host3/?connect=direct;slaveOk=true
** 当你的连接服务器有优先级,还需要列出所有服务器,你可以使用上述连接方式。 安全模式连接到localhost:
> mongodb://localhost/?safe=true
** 以安全模式连接到replica set,并且等待至少两个复制服务器成功写入,超时时间设置为2秒。
> mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
<>1).创建数据库、表
<>创建一个库/切换库,库存在则切换,不存在则创建并切换> use runoob switched to db runoob > db runoob >
<>查看所有库> show dbs local 0.078GB test 0.078GB > <>可以看到,我们刚创建的数据库 runoob
并不在数据库的列表中, 要显示它,我们需要向 runoob 数据库插入一些数据。> db.runoob.insert({"name":"菜鸟教程"})
WriteResult({"nInserted" : 1 }) > show dbs local 0.078GB runoob 0.078GB test
0.078GB > <>创建一个表> db.runoob.insert({"name":"菜鸟教程"}) WriteResult({ "nInserted"
: 1 })
创建一个主键的可自动增长非负的字段的表
创建一个时间等特定字段的表
创建含datetime 与 timestamp 的当未给TIMESTAMP字段赋值时,自动以当前系统时间赋值,而DATETIME字段默认赋值为 NULL的表
创建含enum(值1,值2,值N) 只能在列举的范围内选择一个值set(值1,值2,值N) 能在列举的范围内选择一个或多个值,以及浮点数的表
添加一个auto_increment初始值的表
#指定第一条的编号从多少开始 2).添加表数据
插入文档记录的注意事项 MongoDB 使用 insert() 或 save() 方法向集合中插入文档,语法如下:
db.COLLECTION_NAME.insert(document)
以下文档可以存储在 MongoDB 的 runoob 数据库 的 col 集合中:
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by:
'菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'],
likes: 100 })
** col 是我们的集合名,如果该集合不在该数据库中, MongoDB 会自动创建该集合并插入文档
添加单条数据
同时添加多条数据
同时向特定字段添加多条数据
建表时创建主键
创建主键 primary key
一个表里只能有一个主键,字段值不允许重复且不允许赋null值;若多个字段做主键叫复合主键,复合主键必须一起创建(字段的值不允许同时相同)。和auto_increment连用,让字段的值自动增长
字段的值自加1后给当前字段赋值 通常把表中能够唯一定位一条记录的字段设置为主键字段。
在已有表里创建主键
创建外键 foreign key
1 表的存储引擎必须是innodb 2 字段的类型要一致 3 被参考的字段必须是key 的一种(primary key) 创建父表并插入数据
创建子表
使用外键时的注意事项:
当一个表被参考时 ,表和被参考的字段都不允许删除 一个表里可以有多个外键字段。 一个父表可以被多个子表参考 所有的删除命令
删除字段名
删除主键
删除表结构
删除外键:
2).删除表记录(以行为删除单位)
删除与条件匹配的记录 delete from 库名.表名 where 条件;
删除所有记录。
<>所有的修改命令
1).改名字
修改字段名
修改表名
3).修改表结构
添加至字段之首
添加至指定字段后面
一次添加多个字段
3).修改表数据 ** update() 方法用于更新已存在的文档。语法格式如下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi:
<boolean>, writeConcern: <document> } )
参数说明:
** query : update的查询条件,类似sql update查询内where后面的。
** update : update的对象和一些更新的操作符(如$,$inc...)等,也可以理解为sql update查询内set后面的
** upsert : 可选,这个参数的意思是,如果不存在update的记录,是否插入objNew,true为插入,默认是false,不插入。
** multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
** writeConcern :可选,抛出异常的级别。 集合 col 中插入如下数据:
>db.col.insert({ title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by:
'菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'],
likes: 100 })
通过 update() 方法来更新标题(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) WriteResult({
"nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
#输出信息
> db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"),
"title" : "MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程",
"url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ],
"likes" : 100 } >
** 可以看到标题(title)由原来的 "MongoDB 教程" 更新为了 "MongoDB"。
** 以上语句只会修改第一条发现的文档,如果你要修改多条相同的文档,则需要设置 multi 参数为 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
<>save() 方法
* save() 方法通过传入的文档来替换已有文档。语法格式如下:db.collection.save( <document>, {
writeConcern: <document> } )
参数说明: ** document : 文档数据。 ** writeConcern :可选,抛出异常的级别。 实例中替换了 _id 为
56064f89ade2f21f36b03136 的文档数据:
>db.col.save({ "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" :
"MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" :
"http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 })
** 替换成功后,我们可以通过 find() 命令来查看替换后的数据
>db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title"
:"MongoDB", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "Runoob", "url" :
"http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } >
更新第一条记录:
db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );
db.col.update( {"count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false
);
全部更新:
db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,
true );
只添加第一条:
db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,
false );
全部添加加进去:
db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,
true );
全部更新:
db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,
true );
<>在3.2版本开始,MongoDB提供以下更新集合文档的方法:
** db.collection.updateOne() 向指定集合更新单个文档 ** db.collection.updateMany()
向指定集合更新多个文档
<>1) 首先我们在test集合里插入测试数据
> use test db.test_collection.insert( [ {"name":"abc","age":"25","status":"zxc"
}, {"name":"dec","age":"19","status":"qwe"}, {"name":"asd","age":"30","status":
"nmn"}, ] )
*** 更新单个文档
> db.test_collection.updateOne({"name":"abc"},{$set:{"age":"28"}}) {
"acknowledged" : true, "matchedCount" : 1, "modifiedCount" : 1 } >
db.test_collection.find() { "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name"
:"abc", "age" : "28", "status" : "zxc" } { "_id" : ObjectId(
"59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "qwe" } {
"_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30",
"status" : "nmn" } >
*** 更新多个文档
> db.test_collection.updateMany({"age":{$gt:"10"}},{$set:{"status":"xyz"}}) {
"acknowledged" : true, "matchedCount" : 3, "modifiedCount" : 3 } >
db.test_collection.find() { "_id" : ObjectId("59c8ba673b92ae498a5716af"), "name"
:"abc", "age" : "28", "status" : "xyz" } { "_id" : ObjectId(
"59c8ba673b92ae498a5716b0"), "name" : "dec", "age" : "19", "status" : "xyz" } {
"_id" : ObjectId("59c8ba673b92ae498a5716b1"), "name" : "asd", "age" : "30",
"status" : "xyz" } >
4).修改字段类型
若修改的类型与已经存储的数据有冲突,不允许修改 修改字段约束条件
所有的查看的命令
1).查看已插入文档过程
> db.col.find() { "_id" : ObjectId("56064886ade2f21f36b03134"), "title" :
"MongoDB教程", "description" : "MongoDB 是一个 Nosql 数据库", "by" : "菜鸟教程", "url" :
"http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" :
100 } >
** 将数据定义为一个变量
> document=({title: 'MongoDB 教程', description: 'MongoDB 是一个 Nosql 数据库', by: '
菜鸟教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'],
likes: 100 }); **执行插入操作: > db.col.insert(document) WriteResult({ "nInserted" :
1 }) > **执行后显示结果如下: { "title" : "MongoDB 教程", "description" : "MongoDB 是一个 Nosql
数据库", "by" : "菜鸟教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb",
"database", "NoSQL" ], "likes" : 100 }
2).查看表结构
3).查看建库的过程
4).查看表中复合条件记录指定字段的值
select 字段名列表 from 库名.表名 where 条件表达式;
5).数值比较 (字段必须是数值类型)字段名 符号 值
= != > >= < <=
6).字符比较 (字段必须是数值类型)字段名 符号 "值"
= !=
7).范围内匹配
between...and.... 在...之间 in (值列表) 在...里... not in (值列表) 不在...里...
8).匹配空 is null 匹配非空 is not null
9).逻辑比较
(2个或2个以上查询条件时使用逻辑比较) 逻辑与 and 多个条件必须同时成立 逻辑或 or 多个条件时某一个条件成立就可以 逻辑非 ! 取反
* ( ) 提高优先级
10).模糊查询
字段名 like '模糊查询表达式'; 模糊查询表达式
% 表示零个或多个字符 _ 表示任意一个字符
11). 正则匹配
字段名 regexp '正则表达式'; ^ $ . * [0-9] 0123456789
12).数学计算 + - * / %
13).聚集函数
count(字段名) 统计字段值的个数 max(字段名) 获取字段的最大值 min(字段名) 获取字段的最小值 avg(字段名) 获取字段的平均值
sum(字段名) 统计字段的和
sql查询命令 group by 字段名;
14).查询结果排序
sql查询 order by 字段名 排序方式; asc 默认 升序 desc 降序
15).在查询结果里过滤数据
sql查询 having 条件表达式;
16). 限制显示查询记录的条目
默认会把复合查询条件的记录全部显示出来 sql查询 limit 数字1,数字2; 数字1 表示从查询结果的第几条记录开始显示 数字2 表示显示几条记录
17).复制表(快速创建一个新表 把表备份一下)
源表的字段的key属性不会被复制给新表。 create table 新表名 sql查询; 复制所有内容
create table 新表名 select * from 表名;
18).怎么显示登录的用户名和客户端地址
19). 登录用查看自己的访问权限?
复制部分内容
create table 新表名 select 字段名列表 from 表名 where 条件;
只复制表结构
create table 新表名 select * from 表名 where 不成立的条件;
18).嵌套查询
把内层查询结果作为外层查询的查询条件 select 字段名列表 from 表名 where 条件 (select 字段名列表 from 表名) ;
19).多表查询
select 字段名列表 from 表名1 ,表名2,表名n; select 字段名列表 from 表名1 ,表名2,表名n where 条件表达式;
连接查询 左连接left jion ... on 条件 查询时以左边的表为主显示查询结果 右连接right jion ... on 条件
查询时以左边的表为主显示查询结果 mysql> create table t43 select name,uid,shell from userdb.user
limit 3;
数据的导入与导出
数据导入 : 把系统文件的内容存储到数据库的表里
mysql> LOAD DATA INFILE '文件名' INTO TABLE 表名 FIELDS TERMINATED BY '分隔符' LINES
TERMINATED BY '\n'; 把系统用户信息存储到 userdb库下的user表里/etc/passwd
用户名:密码占位符:uid:gid:描述信息:家目录:shell
*
查看表结构
*
导入数据
数据导入注意事项
字段分隔符要与文件内的一致 指定导入文件的绝对路径 导入数据的表字段类型要与文件字段匹配 数据导出: 把数据库表里记录存储到系统文件里
语法格式:
SQL查询命令 INTO OUTFILE "文件名"; SQL查询命令 INTO OUTFILE "目录名/文件名" fields terminated
by "符号" lines terminated by "符号";
数据导出注意事项
导出的内容由SQL查询语句决定 若不指定路径,默认会放在执行导出命令时所在库对应的数据库目录下。 应确保mysql用户对目标文件夹有写权限。
存储导出数据的文件具有唯一性
热门工具 换一换