一、Mongodb简介
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
二、主要特点
- MongoDB的提供了一个面向文档存储,操作起来比较简单和容易。
- 你可以在MongoDB记录中设置任何属性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。
- 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。
- 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。
- Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
- MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段 。
- Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。
- Map和Reduce。Map函数调用emit(key,value)遍历集合中所有的记录,将key与value传给Reduce函数进行处理。
- Map函数和Reduce函数是使用Javascript编写的,并可以通过db.runCommand或mapreduce命令来执行MapReduce操作。
- GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。
- MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。
- MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。
- MongoDB安装简单。
三、安装
1.下载
根据自己Linux的版本下载对应的mongodb,下载地址:https://www.mongodb.com/download-center#community,下载到 /usr/java 路径下。
2.创建数据库文件路径和数据库日志路径
1) 进入到java路径下,cd /usr/java/
2) 创建mongodbNode文件夹,mkdir mongodbNode
3) 在mongodbNode下,创建data和log文件夹,其中data是存mongodb数据的文件夹,log是存mongodb日志的文件夹
mkdir data log
4) 进入data文件,在data下创建db文件夹,mongodb会将数据文件写到db文件夹下,
mkdir db
3.启动mongodb服务端,有两种方式
1) 命令行方式启动(启动方便),进入到bin目录下(可以通过 ./mongod --help 来查看 mongodb 服务端启动的参数):
./mongod --dbpath /usr/java/mongoNode/data/db --logpath /usr/java/mongoNode/log/mongodb.log --fork --bind_ip 192.168.242.129 --port 27017 --journal
当看到以下信息的时候,则说明启动成功:
当然,我们也可以通过查看后台进程的方式 检查mongodb是否启动成功:netstat -anp|grep mongod
2) 配置文件方式启动(管理起来规范)
a. 在cd /usr/java/mongoNode 下新建一个文件:touch mongodb.conf
b. 编辑文件,vi mongodb.conf
c. 在mongodb.conf中添加如下内容:
dbpath=/usr/java/mongoNode/data/db
logpath=/usr/java/mongoNode/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.242.129
port=27017
d. 将mongodb设置成环境变量:export PATH=/usr/java/mongodb/bin:$PATH
e. 查看环境变量是否生效:echo $PATH
f. 启动:mongod --config mongodb.conf
4.启动mongodb客户端
命令行方式:./mongo --host 192.168.242.129 --port 27017
配置文件方式:mongo --host 192.168.242.129 --port 27017
四、配置文件
# 日志文件位置
logpath=/var/log/mongo/mongod.log
# 以追加方式写入日志
logappend=true
# 是否以守护进程方式运行
fork = true
# 默认27017
#port = 27017
# 数据库文件位置
dbpath=/var/lib/mongo
# 启用定期记录CPU利用率和 I/O 等待
#cpu = true
# 是否以安全认证方式运行,默认是不认证的非安全方式
#noauth = true
#auth = true
# 详细记录输出
#verbose = true
# Inspect all client data for validity on receipt (useful for
# developing drivers)用于开发驱动程序时验证客户端请求
#objcheck = true
# Enable db quota management
# 启用数据库配额管理
#quota = true
# 设置oplog记录等级
# Set oplogging level where n is
# 0=off (default)
# 1=W
# 2=R
# 3=both
# 7=W+some reads
#diaglog=0
# Diagnostic/debugging option 动态调试项
#nocursors = true
# Ignore query hints 忽略查询提示
#nohints = true
# 禁用http界面,默认为localhost:28017
#nohttpinterface = true
# 关闭服务器端脚本,这将极大的限制功能
# Turns off server-side scripting. This will result in greatly limited
# functionality
#noscripting = true
# 关闭扫描表,任何查询将会是扫描失败
# Turns off table scans. Any query that would do a table scan fails.
#notablescan = true
# 关闭数据文件预分配
# Disable data file preallocation.
#noprealloc = true
# 为新数据库指定.ns文件的大小,单位:MB
# Specify .ns file size for new databases.
# nssize =
# Replication Options 复制选项
# in replicated mongo databases, specify the replica set name here
#replSet=setname
# maximum size in megabytes for replication operation log
#oplogSize=1024
# path to a key file storing authentication info for connections
# between replica set members
#指定存储身份验证信息的密钥文件的路径
#keyFile=/path/to/keyfile
五、数据库
一个mongodb中可以建立多个数据库。
MongoDB的默认数据库为"db",该数据库存储在data目录中。
MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。
"show dbs" 命令可以显示所有数据的列表。
运行"use"命令,可以连接到一个指定的数据库。
六、文档
文档是一个键值(key-value)对(即BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
需要注意的是:
1、文档中的键/值对是有序的。
2、文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
3、MongoDB区分类型和大小写。
4、MongoDB的文档不能有重复的键。
5、文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
七、集合
集合就是 MongoDB 文档组,类似于 RDBMS (关系数据库管理系统:Relational Database Management System)中的表格。
集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入集合的数据都会有一定的关联性。
八、操作(CURD)
1.连接到客户端
2.查看数据库:show dbs
3.新建数据库:use testXbq,此时,show dbs不会有刚刚新建的数据库,当向数据库中 新建连接时 或者 直接插入文档 时,才会出现 testXbq数据库。
1) 查看当前使用的数据库: db.getName() 或者 db
2) 显示当前数据库的信息:db.stats()
3) 修复当前使用的数据库:db.repairDatabase()
4) 删除当前使用的数据库:db.dropDatabase()
5) 从指定的机器上复制指定数据库数据到某个数据库:db.copyDatabase("mydb", "temp", "127.0.0.1"); --将本机的mydb的数据复制到temp数据库中
6) 查看当前db的链接机器地址:db.getMongo()
7) 当前db版本:db.version()
8) 查看当前数据库中的所有连接:show collections
4.插入文档,向刚刚创建的连接中 插入文档:db.xbqTable.insert({name:"xbq",sex:"男"}),也可以使用 save方法
5.查询总的的文档:db.xbqTable.find() ,若想要 格式化查询结果,在find()后面加上 .pretty() 即可,如:db.xbqTable.find().pretty()
6.更新文档,修改刚刚插入的文档:db.xbqTable.update({ "_id" : ObjectId("58e40c02aee532ffbea0b89d")},{$set:{name:"徐邦启"}})
multi : 可选,mongodb 默认是false,只更新找到的第一条记录,如果这个参数为true,就把按条件查出来多条记录全部更新。
重新插入几条文档:
更新name为xbq的文档,并将age更新为 24,db.xbqTable.update({name:"xbq"},{$set:{age:24}},{multi:true})
7.删除文档,删除name为 徐邦启的文档:db.xbqTable.remove({name:"徐邦启"})
8.and查询,查询 name 为xbq,并且 address 为 广东深圳 的 文档:db.xbqTable.find({name:"xbq",address:"广东深圳"})
9.or查询,查询 name 为joe 或者 name为 java的文档:db.xbqTable.find({$or:[{name:"joe"},{name:"java"}]})
10.<,<=,> ,>= ,<>
总文档有:
1) 查询age < 15的文档:db.xbqTable.find({age:{$lt:15}})
2) 查询age <= 15的文档:db.xbqTable.find({age:{$lte:15}})
3) 查询age>15的文档:db.xbqTable.find({age:{$gt:15}})
4) 查询年age>=15的文档:db.xbqTable.find({age:{$gte:15}})
5) 查询age != 15的文档:db.xbqTable.find({age:{$ne:15}})
11.模糊查询,查询 name 中包含 o 的文档:db.xbqTable.find({name:/o/});
相当于 select * from xbqTable where name like '%o%';
12.模糊查询,查询name中以 t 开头的文档:db.xbqTable.find({name:/^t/})
相当于 select * from xbqTable where name like 't%';
13.查询指定列 name 和 sex 的数据:db.xbqTable.find({},{name:1,sex:1}) 或者 db.xbqTable.find({},{name:true,sex:true})
相当于 select name,sex from xbqTable;
写 0 或者 false ,则为 排除此列,查询 除了此列的 其他数据
14.查询指定列 name 和 sex的数据,并且 age > 16 的文档:db.xbqTable.find({age:{$gt:16}},{name:1,sex:1})
15.查询去重:db.xbqTable.distinct("sex")
相当于:select distinct(sex) from xbqTable;
16.按照age 排序:
升序:db.xbqTable.find().sort({age:1})
降序:db.xbqTable.find().sort({age:-1})
17.查询前2条的文档:db.xbqTable.find().limit(2)
18.查询3条后的文档(跳过前3条的文档):db.xbqTable.find().skip(3)
19.查询在2--4之间的文档(即先跳过前2条,然后再查询2条)(用于分页查询,limit是pageSize,skip是 第几页 * pageSize):
db.xbqTable.find().skip(2).limit(2)
20.查询第1条的文档:db.xbqTable.findOne() 或者 db.xbqTable.find().limit(1)
21.查询 name 为 xbq的文档数目:db.xbqTable.find({name:"xbq"}).count();
22.分组
九、索引
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
索引是特殊的数据结构,索引存储在一个易于遍历读取的数据集合中,索引是对数据库表中一列或多列的值进行排序的一种结构。
建索引过程会阻塞其它数据库操作,background可指定以后台方式创建索引,即增加 "background" 可选参数。 "background" 默认值为false。
例如:db.xbqTable.ensureIndex({name:1},{background:true}),意思是 在name字段上建立一个升序的索引。