天天看点

MongoDB(二)

一、安装MongoDB

1、安装MongoDB

rpm包下载地址:http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/RPMS/

2、查看rpm包生成的几个重要文件

3、初始化数据库

说明:实际使用中将存放数据的目录放在有冗余的逻辑卷上。

4、启动数据库

5、MongoDB的web接口

MongoDB(二)

二、使用MongoDB

1、MongoDB与MySQL语法对比

   传统的关系数据库一般由数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档对象(document)三个层次组成。MongoDB对于关系型数据库里的表,但是集合中没有列、行和关系概念,这体现了模式自由的特点。

MongoDB(二)
MongoDB(二)
MongoDB(二)
MongoDB(二)

2、mongodb语法

查询colls所有数据

通过指定条件查询

指定多条件查询

指定条件范围查询

查询不包括某内容

支持<, <=, >, >=查询,需用符号替代分别为$lt,$lte,$gt,$gte

也可对某一字段做范围查询

不等于查询用字符$ne

in查询用字符$in

not in查询用字符$nin

取模查询用字符$mod

$all查询

$size查询

$exists查询

$type查询$type值为bsonhttp://bsonspec.org/数 据的类型值

使用正则表达式匹配

内嵌对象查询

1.3.3版本及更高版本包含$not查询

sort()排序

limit()对限制查询数据返回个数

skip()跳过某些数据

snapshot()快照保证没有重复数据返回或对象丢失

count()统计查询对象个数

group()对查询结果分组和SQL中group by函数类似

distinct()返回不重复值

3、查询语句说明:

类似于SQL中select语句,其中<query>相当于where子句,而<projection>相当于要选定的字段。

如果使用的find()方法中不包含<query>,则意味着要返回对应collection的所有文档。

“db.collection.count()”方法可以统计指定collection中文档的个数。

比较运算:

$gt:挑选指定字段值大于指定值的文档,语法格式“{field: {$gt: value}}”;

$gte:挑选指定字段值大于等于指定值的文档,语法格式“{field: $gte: value}”;

$in:挑选指定字段的值位于指定数组中的文档,语法格式“{filed: {$in: [<value1>,<value2>,...<valueN>]}}”;

$lt:挑选指定字段值小于指定值的文档,语法格式“{field: {$lt: value}}”;

$lte:挑选指定字段值小于等于指定值的文档,语法格式“{field: {$lte: value}}”;

$ne:挑选指定字段值不等于指定值的文档,语法格式“{filed: {$ne: value}}”;

$nin:挑选指定字段的值没有位于指定数组中或不存在的文档,语法格式“{filed: {$nin: [<value1>,<value2>...valueN]}}”;

逻辑运算:

逻辑运算一般用于连接多个选择条件,MongoDB支持的逻辑运算“Query Selector”有以下几种:

$or:或运算,语句格式“{$or: [{<expression1>},{<expression2>},... ,{<expressionN>}]}”

$and:与运算,语法格式“{$and: [{<expression1>},{<expression2>},... ,{<expressionN>}]}”

$and:非运算,语法格式“{field: {$not: {<operator expression>}}}”

$nor:反运算,即返回不符合所有指定条件的文档,语法格式“$nor: [{<expression1>},{<expression2>},.... ,{<expressionN>}]}”

元素查询:

如果要根据文档中是否存在某字段等条件来挑选文档,则需要用到元素运算。

$exixts:根据指定字段的存在性挑选文档,语法格式“{ field: {$exists: <boolean>}}”,指定<boolean>的值为“true”则返回存在指定字段的文档,“false”则返回不存在指定字段的文档。

$mod:将指定字段的值进行取模运算,并返回其余数为指定值的文档,语法格式“{field: {$mod: [divisor, remainder]}}”。

$type:返回指定字段的值类型为指定类型的文档,语法格式“{field: {$type: <BSON type>}}”。

3、实际练习

连入数据库

数据的插入

查看状态:

就插入了两条数据而占用了100多M的空间,说明很占用存储空间。

MongoDB(二)

mongodb占用空间过大的原因,在官方的FAQ中,提到有如下几个方面:

空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、 256M那样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。 

字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。我曾建议作者把字段名作个index,每个字段名用一个字节表示,这样就不用担心字段名取多长 了。但作者的担忧也不无道理,这种索引方式需要每次查询得到结果后把索引值跟原值作一个替换,再发送到客户端,这个替换也是挺耗费时间的。现在的实现算是 拿空间来换取时间吧。 

删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。 

可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢。 

删除collections:

添加练习例子:

查看前两行文档:

删除年龄为5的文档:

删除用户为User:3的文档:

将User:4用户的年龄改为22:

查看test库的文档数,及年龄大于97的文档:

查询年龄大于97的文档并只显示Name和Age:

查询Age大于60并小于66的文档:

查询包含Adress字段的文档:

将Age大于98文档中的Gender改为M:

将Name为User:99的文档中PreferBooks项给删除: