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

安装

  1. 下载对应的稳定版源代码,并放置到(/usr/local/src目录下)

    官网:www.mongodb.org

    中文手册:http://www.runoob.com/mongodb/mongodb-tutorial.html

    中文社区:http://www.mongoing.com/

    http://www.open-open.com/

    http://www.infoq.com.cn

     

  2. 上传、解压文件(/usr/local/src/

        

  3. 不需要编译,因为官方已经编译好,可以直接使用

    a. 一般都软件放在放在/usr/local/NAME 下

    b. 创建软连接

    c. 简单命令:

     

    d. 启动MongoDB服务:

    1. 使用服务端 --help 参数查看

    # ./mongodb --help

    1. 或者查看 README文件

    创建mongodb的数据文件夹

    3. 启动服务

    4. 显示效果:

    注意:使用上面的命令启动mongodb后,这个时候mongodb服务会占据该窗口,如果要关闭该窗口,ctrl+c 即可关闭该窗口

     

    5. 客户端连接:

  4. 简单命令

     

     

  5. 问题:如何让MongoDB在后台启动?
  6. 启动mongoDB 如果mongoDB以后台运行,必须加上 --logpath 后面必须要指定日志文件的名称

    # ./bin/mongod --dbpath /data/db --logpath /data/db/log.txt --fork --port 27017

    参数解释:

    --dbpath 数据存储目录

    --logpath 日志存储目录(加上日志的名称)

    --port 运行端口(默认27017)

    --fork 后台进程运行

     

    mongoDB使用

    入门命令

  7. show dbs 查看当前的数据库(类似mysql: show databases)

    问题:MySQL下在命令行下如何查看当前正在使用的数据库?

    答:

    # select database();

     

  8. use databaseName 选库

    答:MongoDB可以隐式的创建,直接use NAME 可以创建一个数据库

     

  9. show tables 查看当前库下的数据表
    1. show collection;

    注意:即使数据不存在,也可以直接切换,会自己创建。但是如果在数据库中不创建collection是不会显示的。

     

    创建数据库

    mongoDB的库是隐式创建,当use 一个不存在的库的时候,然后在该库下创建tables(collection)后即可创建数据库

    创建表

    注意:在使用命令行的时候,可以使用tab 快速的补齐

     

  10. 显式创建

    db.createCollection('collectionName') 创建表

     

     

  11. 隐式创建

    db.collectionName.insert(document) 向一个不存在的表里在插入数据的时候,隐式的创建表

     

  12. 可以使用

    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扩展

  13. 下载源码

    下载地址:http://pecl.php.net/package/mongo

    a. 点击对应的【dll】

    b. 选择合适的php版本,这个时候需要注意的是,选择版本的时候,存在php线程安全选择。

    注意:线程安全信息如何查看?

    答:可以去php软件包,查找如下信息

    c. 将下在dll文件放置到php的ext目录

    d. 修改php.ini文件

    e. 一定要重启Apache

    f. 建立一个phpinfo() 测试函数即可

     

    Linux下安装

  14. 上传到 /usr/local/src

    解压

     

  15. 执行phpize命令

  16. 执行make && make install

  17. 生成目录

  18. 修改php.ini

  19. 重启Apache

     

  20. 创建测试文件

    mongodb实现短网址案例

    将一个非常长的URL地址转换为一个比较短的URL地址。主要为了用户的一个体验,因为短的信息美观一些。

    一般在微博里面最常见。

    体验地址:

    http://dwz.wailian.work/

    效果:

    实现技术点:

  21. 用户先输入一个长的网址,然后发送ajax请求去后台生成短的网址
  22. 到时候后台会保存一个 短网址 和 长网址的对应关系
  23. 当用户利用短网址去访问的时候,短网址的服务器或先判断短网址是否在本地的数据库里面存在,如果存在则取出后使用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. 短网址尽量乱,无规律。防止发现规律后批量请求。

    代码实现

  24. 创建一个 输入页面

     

  25. 完成页面的ajax提交事件

     

  26. 后台生成短网址和长网址的映射关系

  27. 伪静态规则

     

  28. index.php文件做跳转

     

  29. 复制按钮
    1. 复制静态资源

    1. 修改val值 和 点击复制按钮的ID

     

  30. 效果

     

     

     

     

     

posted @ 2016-04-12 23:32  尼农小道  阅读(312)  评论(0编辑  收藏  举报