1 MongoDB简介
1.1 NoSQL简介
NoSQL(NoSQL,Not Only SQL ),意即"不仅仅是SQL"。
1970年,关系型数据库诞生,用于规范性的管理数据。NoSQL 是一项全新的数据库革命性运动,提倡运用非关系型的数据存储。NoSQL用于超大规模数据的存储,这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。
知名数据库:列存储HBase,文档存储MongoDB,键值存储Redis。
1.2 MongoDB简介
MongoDB是一个基于分布式文件存储的数据库。MongoDB是一个介于关系数据库和非关系数据库(nosql)之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 SQL的table。字段值可以包含其他文档,数组等。
2 MongoDB基础概念
- mongodb中基本概念有文档、集合、数据库。
- 一个mongodb中可以建立多个数据库。MongoDB的默认数据库为"db",该数据库存储在data目录中。
- 集合就是 MongoDB 文档组,类似于 RDBMS 中的table。相对于sql,集合没有固定的结构,对集合可以插入不同格式和类型的数据。
- 文档是一个键值(key-value)对,类似于 RDBMS 中的record。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
2.1 MongoDB的数据类型
MongoDB中常用的几种数据类型:
- String:字符串类型。
- integer:整型数值,用于存储数值型数据。
- boolean:布尔值(真或假)。用于存储布尔类型。
2.2 MongoDB的运算符
数学运算符: 略
条件运算符:
- (>) 大于:$gt
- (<) 小于:$lt
- (>=) 大于等于:$gte
- (<= ) 小于等于: $lte
$type运算符:使用数字代表数据类型。比如db.tableName.find({"column1" : {$type : 1}})表示获取字段column1中数据类型为double的记录。
- Double:1
- String:2
- Object:3
- Array:4
- Boolean:8
- Date :9
- Null:10
2.3 数据类型转换
instance of:判断类型。
NumberInt函数:字符串转换为int类型。
3 MongoDB的数据库
SQL和MongoDB的对比
3.1 数据库命名规则
推荐的命名规范:
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、和0 (空宇符)。
- 应全部小写。
- 最多64字节。
3.2 数据库的操作
语法:db.DatabaseName.Method。(MongoDB的命令末尾的分号可有可无。)
- 显示所有数据库:show databases/dbs。
- 显示当前数据库:db。
- 切换数据库:use DatabaseName。
- 创建数据库:db.DatabaseName.insert({“id’”: 1}); (切换到一个不能存在的数据库并插入数据,就可以自动创建一个数据库和一个集合。)
- 删除数据库:db.dropDatabase(); 删除当前的数据库,这个函数没有参数。
:
>
3.3 数据存在硬盘的位置
安装时会提示数据的存放路径:E:Program FilesMongoDBServer4.0data。
也可以连接MongoDB时指定路径,语法形式为:mongod --dbpath D:xx。
表对应的是.wt格式的文件。
4 MongoDB的表
即collection。
4.1 表的命名规则略
4.2 表的操作
- 查看所有表:show tables或show collections;
- 创建表:db.collection_name.insert(document); 对不存在的表插入数据,会自动创建表。
- 删除表:db.collection_name.drop();
:
>
4.3 数据的操作
插入数据:db.COLLECTION_NAME.insert(document); 使用insert或save函数进行插入。
修改数据: 使用update或save函数进行数据的更新。
db
实操 :
>
4.4 查询数据 SQL的语法:select 字段from table where 条件 group by 字段 order by 字段;
MongoDB的语法:db.collection_name.find({查询条件}, {查询结果返回的字段}).sort({排序字段});
- 如果要以易读的方式来读取数据,加上 pretty函数:db.collection_name.find().pretty()
- 如果只想要一条结果,使用findOne:db.collection_name.findOne()
- 筛选:find函数的第一个参数。直接写在冒号后面:等于,$ne:不等于,$gt:大于,$lt:小于。
- and并:db.COLLECTION_NAME.find({key1:value1, key2:value2}); find函数的参数可以传入多个值,用逗号隔开,类似sql的and。
- or或: db.COLLECTION_NAME.find( {$or: [{key1: value1}, {key2:value2}] } ) 使用$or关键字来实现or。注意find的参数一个字典,字典的key$or对应的value是一个数组,数组的元素是多个字典。
- 返回多少条记录:db.COLLECTION_NAME.find().limit(n) 类似mysql的limit。
- 跳过多少条记录:db.COLLECTION_NAME.find().limit(n).skip(NUMBER) 使用skip跳过指定数量的记录。
- 排序:db.COLLECTION_NAME.find().sort({KEY:1}) 使用sort方法排序,1表示升序,-1表示降序。
:
>
5 分组聚合
聚合(aggregate),把数据按字段分组,返回计算后的数据结果。类似SQL的count ... group by。
语法:db.collection_name.aggregate(AGGREGATE_OPERATION)
实操:
>
6 索引
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
创建索引:db.COLLECTION_NAME.ensureIndex({KEY:1}, {parameters:value}) 使用ensureIndex函数创建索引。1表示升序创建索引,-1表示降序创建索引。
实操:
>