zoukankan      html  css  js  c++  java
  • 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. 效果

       

       

  • 相关阅读:
    python 字典
    python 列表
    被闭包啪啪啪的打脸之 闭包的错误使用
    TCP的三次握手和四次挥手
    传输层的TCP和UDP协议
    个人小程序应用开发指南
    ES2019 / ES10有什么新功能?
    CSS开启硬件加速来提高网站性能
    js中this的指向问题
    Js面向对象构造函数继承
  • 原文地址:https://www.cnblogs.com/nyxd/p/5385067.html
Copyright © 2011-2022 走看看