本篇博客讲带大家了解MongoDB的特点和体系结构,掌握常用的MongoDB命令。
1、什么是MongoDB
MongoDB
是一个跨平台的,面向文档的数据库,是当前 NoSQL
数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似 JSON
的 BSON
格式,因此可以存储比较复杂的数据类型。
MongoDB 的官方网站地址是:http://www.mongodb.org/
2、 MongoDB特点
MongoDB
最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。具体特点总结如下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)自动处理碎片,以支持云计算层次的扩展性
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序,社区中也提供了对 Erlang 及 .NET 等平台的驱动程序
(9) 文件存储格式为 BSON(一种 JSON 的扩展)
3、MongoDB体系结构
文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),相当于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
文档(document)、集合(collection)、数据库(database)的层次结构如下图:
下表是MongoDB与MySQL数据库逻辑结构概念的对比:
4、MongoDB基本的数据类型
null:用于表示空值或者不存在的字段,{“x”:null}
布尔型:布尔类型有两个值true和false,{“x”:true}
数值:shell默认使用64为浮点型数值。{“x”:3.14}或{“x”:3}。对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数), {“x”:NumberInt(“3”)}{“x”:NumberLong(“3”)}
字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“呵呵”}
日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()}
正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”: /[abc]/}
数组:数据列表或数据集可以表示为数组,{“x”: [“a“,“b”,”c”]}
5、吐槽和评论数据特点分析
(1)数据量大
(2)写入操作频繁
(3)价值较低
对于这样的数据,我们更适合使用MongoDB来实现数据的存储
1、选择和创建数据库
选择和创建数据库的语法格式(该命令如果数据库不存在,就会自动创建):
use 数据库名
举例(创建一个student数据库):use studentdb
2、插入与查询文档
(1)查询集合的语法格式:db.集合名称.find()
举例(如果我们要查询spit集合的所有文档,我们输入以下命令):db.student.find()
注意:这里你会发现每条文档会有一个叫_id的字段,这个相当于我们原来关系数据库中表的主键,当你在插入文档记录时没有指定该字段,MongoDB会自动创建,其类型是ObjectID类型。如果我们在插入文档记录时指定该字段也可以,其类型可以是ObjectID类型,也可以是MongoDB支持的任意类型。
(2)插入文档的语法格式: db.集合名称.insert(数据);
举例(向student中插入一条数据):db.student.insert({_id:NumberInt(1),name:“张三”,age:NumberInt(16),gradeId:NumberInt(1)})
(3)条件查询:db.集合名称.find({条件})
举 例(查询学生姓名为张三学生):db.student.find({name:“张三”})
(查询性年级为1的第一条数据):db.student.findOne({gradeId:1})
(查询性年级为1的第n条数据):db.student.find({gradeId:1}).limit(n)
(4)模糊查询
MongoDB的模糊查询是通过正则表达式的方式实现的。格式为:db.student.find({/模糊查询字符串/})
举例(查询名字中有 唐 的学生):db.student.find({name:/唐/})
(查询学生名字以 张 开头的学生):db.student.find({name:/^张/})
(5)修改文档的语法结构:db.集合名称.update(条件,修改后的数据)
举例(修改学生id为1的学生,年龄为22):db.student.update({_id:1},{$set:{age:22}})
(6)删除文档的语法结构:db.集合名称.remove(条件)
举例(删除学生姓名为张三的学生):db.student.remove({name:“张三”’})
注意!如果不写条件就会讲数据全部删除,请慎用!!!
(7)统计条数的语法结构:db.集合名称.count({条件})
举例(统计年龄为18的学生个数):db.student.count({age:18})
(8)大于 小于 不等于的语法结构
db.集合名称.find({ "field" : { $gt: value }}) // 大于: field > value
db.集合名称.find({ "field" : { $lt: value }}) // 小于: field < value
db.集合名称.find({ "field" : { $gte: value }}) // 大于等于: field >= value
db.集合名称.find({ "field" : { $lte: value }}) // 小于等于: field <= value
db.集合名称.find({ "field" : { $ne: value }}) // 不等于: field != value
举例(查询年龄大于等于18的学生):sb.student.find({age:{$gte:18}})
(9)列值增长
如果我们想实现对某列值在原有值的基础上进行增加或减少,可以使用 $ inc
运算符来实现
举例(学生id为1的年龄加1):db.student.update({_id:1},{$inc:{age:NumberInt(1)}})
(10)条件连接
我们如果需要查询同时满足两个以上条件,需要使用$and操作符将条件进行关联。(相当于SQL的and)
格式为:db.集合名称.find({$and:[ { },{ },{ } ]})
举例(查询学生年龄大于15小于17的学生):db.student.find({ $ and:[ {age:{ $ gte:15}},{age:{$lt:17} } ]})
如果两个以上条件之间是或者的关系,我们使用操作符进行关联,与前面and的使用方式相同
格式为:db.集合名称.find({$or:[ { },{ },{ } ]})
(11)包含与不包含
包含使用$in
操作符
举例(查询student集合中id包含88和99的数据):db.student.find({_id:{$in:[88,99]}})
不包含使用$ nin
操作符。
举例(查询student集合中id不包含88和99的数据):db.student.find({_id:{$nin:[88,99]}})