mongoDB 学习
mongoDB简介
简介
mongoDB被称为文档型数据库,当然也叫nosql数据库(不使用sql作为查询)。
文档:存储的是文档,专业术语叫做Bson(Bson-> json的二进制化后的数据)
特点:mongodb内部使用js解释引擎来实现数据的分析,在插入的时候,将数据转换成二进制的Bson来存储;在查询的时候,将数据Bson转换成json对象返回。
需要注意:一般mongodb数据库主要是和node.js(web服务器和一个js解释器)配合使用。
全栈开发工程师(数据库:mongodb 服务器语言:node.js 前端:bootstrap):js语言做开发
面试问题一:mongodb与传统关系型数据(MySQL)有什么区别?
答: mongodb没有表结构的概念,传统的关系型数据库的数据必须按照表的结构来存储(行、列形成的二维表,二维表之间形成实体关系、ER模型)。在mongodb中没有表的概念,将表换了一种称呼,叫做Collection(集合);对应表中记录也换了一种称呼,叫做Document(文档)(由多个document组成的起来叫做collection)。由多个collections组成的起来叫做数据库。
table === collection
row ==== document
查看资料:http://www.runoob.com/mongodb/mongodb-tutorial.html
安装
-
下载对应的稳定版源代码,并放置到(/usr/local/src目录下)
中文手册:http://www.runoob.com/mongodb/mongodb-tutorial.html
-
上传、解压文件(/usr/local/src/)
-
不需要编译,因为官方已经编译好,可以直接使用
a. 一般都软件放在放在/usr/local/NAME 下
b. 创建软连接
c. 简单命令:
d. 启动MongoDB服务:
-
使用服务端 --help 参数查看
# ./mongodb --help
-
或者查看 README文件
创建mongodb的数据文件夹
3. 启动服务
4. 显示效果:
注意:使用上面的命令启动mongodb后,这个时候mongodb服务会占据该窗口,如果要关闭该窗口,ctrl+c 即可关闭该窗口
5. 客户端连接:
-
-
简单命令
-
问题:如何让MongoDB在后台启动?
-
启动mongoDB 如果mongoDB以后台运行,必须加上 --logpath 后面必须要指定日志文件的名称
# ./bin/mongod --dbpath /data/db --logpath /data/db/log.txt --fork --port 27017
参数解释:
--dbpath 数据存储目录
--logpath 日志存储目录(加上日志的名称)
--port 运行端口(默认27017)
--fork 后台进程运行
mongoDB使用
入门命令
-
show dbs 查看当前的数据库(类似mysql: show databases)
问题:MySQL下在命令行下如何查看当前正在使用的数据库?
答:
# select database();
-
use databaseName 选库
答:MongoDB可以隐式的创建,直接use NAME 可以创建一个数据库
-
show tables 查看当前库下的数据表
-
show collection;
注意:即使数据不存在,也可以直接切换,会自己创建。但是如果在数据库中不创建collection是不会显示的。
创建数据库
mongoDB的库是隐式创建,当use 一个不存在的库的时候,然后在该库下创建tables(collection)后即可创建数据库
创建表
注意:在使用命令行的时候,可以使用tab 快速的补齐
-
-
显式创建
db.createCollection('collectionName') 创建表
-
隐式创建
db.collectionName.insert(document) 向一个不存在的表里在插入数据的时候,隐式的创建表
-
可以使用
show tables 查看当前数据库下的表(collection)
show collections 也可以查看当前数据库下的表(collection)
删除表
db.collectionName.drop() 删除表
删除数据库
db.dropDatabase() 删除数据库
基本增删改查命令
1. find() 查找 # select * from tableName;
注意:mongoDB会自动帮我们维持一个主键ID(_id)不需要也不建议手工的修改
主键:1. 约束唯一 2. 快速查找
# db.CollectioNAME.find()
注意:
增加数据 insert
# db.collectionName.isnert(document) 注意 这里的document 是一个 json对象
例如:
单条记录:
# db.collectionName.insert({_id:5, age:18, name:'asion'});
多条记录
# db.collectionName.insert(
[
{date:'2014-12-12', study:'mongodb'},
{_id:9, gender:'male', name:'caoyang'}
]
)
删除数据 remove
# db.collection.remove(查询表达式, 选项);
# delete from tableName where id > 1 limit 1;(查询表达式,)
选项是指 {justOne:true/false},是否只删一行, 默认为false
注意
1: 查询表达式依然是个json对象
2: 查询表达式匹配的行,将被删掉
3: 如果不写查询表达式,tables中的所有文档将被删掉
例1: db.students.remove({sn:'001'});
删除students表中 sn属性值为'001'的数据
例2: db.students.remove({gender:'m'},{justOne:true});
删除students表中gender属性为m的文档,只删除1行
修改数据 update
# db.collection.update(查询表达式, 新值)
# udpate tableName set name = 'asion' where id = 1;
注意
修改什么? ---> 查询表达式指定
改成什么样? --> 新值 或 赋值表达式
例如:
# db.news.update({name:'asion'},{name:'caoyang'});
是指选中news表中,name值为qq的数据,并把其文档值改为{name:'caoyang'}
结果: 文档中的其他列不见了,改后只有_id和name列数据
注意-->新值直接替换了旧值,而不是修改,那我们设置的值做了一个全部的替换
所以:如果是想修改数据的某列,可以用$set关键字
# db.collectionName.update({name:'asion'}, {$set:{name:'caoyang'}})
注意:只想修改document里面的某一个信息
查询数据 find, findOne
# db.collection.find(查询表达式, 显示的列);
# db.collections.find(查询表达式, {列1:1,列2:1});
例1:db.students.find(查询表达式, 显示的信息)
查询students所有数据
例2: db.students.find({},{gender:1})
{} 取出所有
查询所有文档数据,但是只显示gender列数据 (_id属性默认总是查出来)
# select gender from tableName;
例3: db.students.find({},{gender:1, _id:0})
查询所有文档数据,但是只显示gender列信息,且不显示_id列信息
例4: db.students.find({gender:'male'}, {name:1, _id:0});
查询所有gender值为male的数据,但是只显示name这列信息
php操作mongoDB
学习文章:http://www.fkblog.org/blog569
php-mongoDB扩展
-
下载源码
下载地址:http://pecl.php.net/package/mongo
a. 点击对应的【dll】
b. 选择合适的php版本,这个时候需要注意的是,选择版本的时候,存在php线程安全选择。
注意:线程安全信息如何查看?
答:可以去php软件包,查找如下信息
c. 将下在dll文件放置到php的ext目录
d. 修改php.ini文件
e. 一定要重启Apache
f. 建立一个phpinfo() 测试函数即可
Linux下安装
-
上传到 /usr/local/src
解压
-
执行phpize命令
-
执行make && make install
-
生成目录
-
修改php.ini
-
重启Apache
-
创建测试文件
mongodb实现短网址案例
将一个非常长的URL地址转换为一个比较短的URL地址。主要为了用户的一个体验,因为短的信息美观一些。
一般在微博里面最常见。
体验地址:
效果:
实现技术点:
-
用户先输入一个长的网址,然后发送ajax请求去后台生成短的网址
-
到时候后台会保存一个 短网址 和 长网址的对应关系
-
当用户利用短网址去访问的时候,短网址的服务器或先判断短网址是否在本地的数据库里面存在,如果存在则取出后使用php的header('location:URL')函数做一个跳转即可完成。
思路:
1. 短网址必须唯一,一一对应。可以参考MySQL的主键ID,即可以自增,也可以唯一
2. 网址必须短,但是需要存储的信息多。这个时候可以使用进制实现
http://t.cn/h51HY h51HY(尽可能让它短一些,但是需要存储的数据要多)
二进制 111111 2^6
八进制 777777 8^6
十六进制 FFFFFF F 16^6
六十二进制 62^6
500多亿
3. 短网址尽量乱,无规律。防止发现规律后批量请求。
代码实现
-
创建一个 输入页面
-
完成页面的ajax提交事件
-
后台生成短网址和长网址的映射关系
-
伪静态规则
-
index.php文件做跳转
-
复制按钮
-
复制静态资源
-
修改val值 和 点击复制按钮的ID
-
-
效果