Day1.MongoDB学习笔记1 - 20181201
零、大数据引言
- 什么是大数据,其本质是什么?
①、数据的存储:分布式文件系统(分布式存储)
②、数据的计算:分布式计算
有两个大数据相关的技术Hadoop(基于java语言开发)和Spark(基于Scala语言,Scala基于java)
- 大数据的基础和学习路线
1)Java基础和Linux基础
2)Hadoop的学习:体系结构、原理、编程
①第一阶段:HDFS(存储:分布式文件系统)、MapReduce(java程序:数据的计算)、HBase(NoSql)
②第二阶段:数据分析引擎 :Hive、Pig;数据采集引擎:Sqoop、Flume
③第三阶段:一些组件:HUE(管理工具:基于网页管理Hadoop)、ZooKeeper(实现Hadoop的HA)、Dozie(工作流引擎)
3)Spark的学习:
①第一阶段:Scala编程语言
②第二阶段:Spark Core(基于内存的数据计算)
③第三阶段:Spark SQL(类似sql语句,用来操作大数据)
④第四阶段:Spark Streaming(实时流式计算)
4)Apache Storm的学习(实时结果存储):类似Spark Streaming 、Redis基于内存NoSql
一、数据存储 【企业中如何进行数据的存储?】
-
数据的分类(大致分三种)
①、结构化数据
数据有规则,可使用传统数据库表进行存储
RDBS:oracle、mysql
(“主从复制集群”,binlog,到达数据备份,高可用;
“读写分离集群”,主写从读,达到高性能)
(“海量数据存储”,大数据量,分库分表,水平拆分(将一张大表数据水平分成小表))
(分表操作示例:主键%模小表的数量,均匀选择小表存储数据)
(MyCat:阿里的分库分表中间件)②、半结构化数据
有一定规则,数据有变化,例:json,xml 选择NoSQL存储(不是结构化数据)
-
NoSQL优势与缺点?存储海量数据(日志,物流)
优:1.高可扩展性(水平扩展),2.分布式计算,3.低成本,4.数据结构灵活无限制,5.没有复杂关系
缺:1.弱事务,2.查询语言不统一且功能有限,3.数据安全较差 -
选择?
1.事务要求高 数据完整性特别重要,使用关系型数据库
2.一般的数据或者后期可能扩展的数据,使用NoSql
3.不重到的数据(缓存)redis、memcached
4.二进制数据 fastdfs,公司内部特有分布式文件系统 -
数据库
redis 键值型数据库
mongodb 文档型数据库(最像关系型数据库NoSql产品)
Hbase 列存储NoSQL (即可存结构,又可半结构)
Neo4j 图形存储Nosq③、非结构化数据
指:二进制数据,无法文本打开的文件
a、存储服务器不好,会影响服务器性能,数据可能会丢失,如果tomcat构建集群的化,可能会造成文件无法访问。
b、mysql数据库: blob数据类型,大规模的文件存储 和 读取影响性能
c、fastdfs分布式文件系统:特性负载均衡,冗余备份,文件去重特性
(fastdfs集群:同group(组)自动数据同步,
tracker服务器:处理请求调度;
storage服务器:储服务器)
二、MongoDB引言
- MongoDB是一款免费开源的NoSql文档型数据库,旨在为Web应用提供可扩展的高性能数据存储解决方案。
- MongoDB特点
1、数据存储格式为BSON(一种二进制形式的存储格式,类似于JSON)形式field:value
{
name:"name",
age:22,
status:"B",
groups:["g1","g2"]
}
2、丰富的查询语言(CRUD、数据聚合、全文检索、地理位置查询)——最像关系型数据库
3、高可用(副本集)——类似“主从复制” + 容错纠错能力
4、水平扩展,支持海量数据存储(分片)
5、MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言
6、支持完全索引——所有字段都可索引
三、MongoDB中概念解析
| sql术语 | MongoDB术语 | 说明 |
|---|---|---|
| database | database | 数据库 |
| table | collection | 集合 |
| row | ducument | 文档,一条记录 |
| index | index | 索引 |
| primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
| foreign key | 无 | 无 |
四、环境搭建 (最新只在64位运行)
- 从零开始大搭环境
①安装号Linux64位后,执行操作激活ip
ifconfig -a //查看ip情况
vi /etc/sysconfig/network-scripts/ifcfg-eth0 //进入vi编辑,多使用tab补全避免出错
//将onboot改成yes
保存编辑后
ifup eth0 //启动eth0
ifconfig -a //查看ip生效否(我的inet addr是192.168.153.136)
②使用CRT远程操作
//连接成功后 alt+p 进入准备上传(打开了个新窗口)
//将文件拖入黑窗口
//去到原始窗口 ll 查看文件
tar -zxvf mongodb-linux-x86_64-3.6.9.tgz //解压
mv mongodb-linux-x86_64-3.6.9 mongodb //安装 并 重命名为mongodb
cd mongodb //进入mongodb文件夹,可以查看下目录结构,在bin下查看命令
service iptables status; //查看防火墙状态
service iptables stop; //关闭防火墙
指令详情:
./mongod -help //可查看指令详情
~clone session //打开新窗口
mkdir -p /data/db //递归创建db文件夹
~在原窗口
./mongod --port 27017 --dbpath=/data/db //启动服务,并指定启动端口号和文件存储目录
./mongod --port 27017 --dbpath=/data/db --bind_ip_all //绑定ip启动
出现 waiting for connections on port 27017 表示启动生效
~在克隆的新窗口
cd mongodb/bin //先进入文件夹,(ps:鼠标选择即是复制)
./mongo 127.0.0.1:27017 //远程连接mongodb 地址+端口
- tips:
mongodb命令窗口支持javascript
mongodb类似mysql,选库再选表
五、常用指令
启服务与进入数据库
cd mongodb/bin
./mongod --port 27017 --dbpath=/data/db --bind_ip_all
新窗口
cd mongodb/bin
./mongo 127.0.0.1:27017
数据库相关,常用指令
cls //清屏
show dbs //展示所有数据库信息 ps:分号可加可不加
db //展示当前使用的数据库
use 数据库名 //切换数据库
db.dropDatabase() //删除数据库
db.createCollection("first") //创建集合,名称”first“,【类似创建table】
MongoDB的增删改查操作
- 增加 insert
单个文档插入
db.COLLECTION_NAME.insert(document)
//插入 COLLECTION_NAME类似表名、 document bson格式数据

批量文档插入
db.COLLECTION_NAME.insert([document,document1.....]) //注意[]

注:在高版本mongodb中又新增了 db.collection.insertOne()和db.collection.insertMany() 这两个方法,分别用来插入单个文档和多个文档(推荐使用,好区分)
ps:tab键可补全命令
- 简单查询 find
查集合中所有文档
db.collection.find({}) //等同于SQL查询中的 SELECT * FROM collection
db.collection.find({}).pretty(); //优雅显示

指定条件查询 { <field1 >: <value1>}
db.collection.find({ field1 :value1 });
//类似于 select * from collection where field1 = value1

- 修改 update
db.collection.update(<filter>, <update>); //修改xxx 为 yyy
db.collection.updateOne(<filter>, {<update operator>: { <field1>: <value1>, ... }) //只修改符合条件的第一条文档

注:$set 操作符 使用指定的value替换旧值,如果修改属性不存在则 创建
db.collection.updateMany(<filter>, {<update operator>: { <field1>: <value1>, ... }) //批量修改
db.collection.replaceOne() //替换除_id外的所有属性
- 删除 deleteOne / deleteMany
db.collection.deleteOne({<field1>: <value1>,...}) //单删
db.collection.deleteMany({<field1>: <value1>,...}) //批删

MongoDB的复杂查询
- 使用查询操作符指定条件
语法: { <field1 > : { <operator1 >: <value1 > }, ... }
其中,operator:
$in //枚举查询,等同in
$and //等同and ps:,也等同and
$or
$lt //<
$gt //>
$lte //<=
$gte //>=
- 查询结果排序
语法: db.collection.find().sort({_id:1}) //1 升序、-1 降序
- 分页查询
语法: db.collection.find().sort().skip(起始条数).limit(结束条数)
- 总条数
语法: db.collection.find().count()
- 模糊查询
语法: db.collection.find({"name":/b/});
六、使用Java操作MongoDB
- 依赖
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongodb-driver</artifactId>
<version>3.6.1</version>
</dependency>
- 插入
@Test
public void testInsert(){
//创建连接
MongoClient mongoClient = new MongoClient("192.168.153.136", 27017);
//选择库
MongoDatabase database = mongoClient.getDatabase("test1");
//拿到集合对象
MongoCollection<Document> collection = database.getCollection("first");
//创建Document对象 BSON形式
Document document = new Document().append("name","duncan")
.append("num","21")
.append("friends", Arrays.asList("parker","manu","popo"));
collection.insertOne(document);
mongoClient.close();
}
可能出现的错误:
①connect time out //连接超时,关闭防火墙
②connection refused:connect
③Exception opening socket //3.6版本的MongoDB,只允许localhost连接,使用
// ./mongod --port 27017 --dbpath=/data/db --bind_ip_all //绑定ip启动

- 修改 删除 同理
- 查询 亦同理
@Test
public void testFind(){
FindIterable<Document> documents = collection.find();
for (Document document : documents) {
System.out.println(document);
}
}
//其他
// 模糊查询 参数二:模糊条件
documents = collection.find(regex("test","test"));
// 排序 SELECT * FROM t_user WHERE i >= 90 order by i desc
documents = collection.find(gt("i",90)).sort(Sorts.descending("i"));
// 分页查询
documents = collection.find().skip(50).limit(10);

浙公网安备 33010602011771号