Day1.MongoDB学习笔记1 - 20181201

零、大数据引言

  1. 什么是大数据,其本质是什么?
    ①、数据的存储:分布式文件系统(分布式存储)
    ②、数据的计算:分布式计算

有两个大数据相关的技术Hadoop(基于java语言开发)和Spark(基于Scala语言,Scala基于java)

  1. 大数据的基础和学习路线
    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

一、数据存储 【企业中如何进行数据的存储?】

  1. 数据的分类(大致分三种)
    ①、结构化数据
    数据有规则,可使用传统数据库表进行存储
    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位运行)

  1. 从零开始大搭环境
    ①安装号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格式数据

图1.05
批量文档插入

db.COLLECTION_NAME.insert([document,document1.....])	//注意[]

图1.07
注:在高版本mongodb中又新增了 db.collection.insertOne()和db.collection.insertMany() 这两个方法,分别用来插入单个文档和多个文档(推荐使用,好区分)
ps:tab键可补全命令

  • 简单查询 find
    查集合中所有文档
db.collection.find({}) //等同于SQL查询中的 SELECT * FROM collection
db.collection.find({}).pretty();	//优雅显示	

图1.06
指定条件查询 { <field1 >: <value1>}

db.collection.find({ field1 :value1 }); 
//类似于 select * from collection where field1 = value1

图1.08

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

图1.09
注:$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>,...})	//批删

图1.09

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

  1. 依赖
	<dependency>
        <groupId>org.mongodb</groupId>
        <artifactId>mongodb-driver</artifactId>
        <version>3.6.1</version>
    </dependency>
  1. 插入
	@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启动

图1.12

  1. 修改 删除 同理
  2. 查询 亦同理
	@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);

posted @ 2018-12-01 23:10  大竹薙子与豆子  阅读(163)  评论(0)    收藏  举报