PHP之mongodb

PHP二次开发 PHP 109 次浏览 , 没有评论

什么是NOSQL?

nosql(not only sql),指非关系型数据库。常见产品:mongodb,redix,memcache等。通常以key-val的形式存储数据。

特点:

  1. 操作简单、灵活
  2. 高并发时读写的性能优秀
  3. 可以分布式存储(便于扩展)

mongodb与MYSQL性能比较

运行mongodb服务器软件

下载地址:https://www.mongodb.com/download-center/community

服务器默认监听27017端口,默认安装目录:C:\Program Files\MongoDB;配置环境变量:C:\Program Files\MongoDB\Server\4.0\bin

使用客户端程序连接服务器

在命令行中运行mongo命令连接服务器,默认连接本地。

MONGDB的使用

mongodb的脚本语言:javascript

帮助:分为三级

  • 系统级别:help
  • 数据库表:db.help()
  • 集合:db.user.help()

db变量

db代表当前连接的数据库。并且只能用这个变量代表当前数据库,如果切换数据库使用
use blog –> 切换到blog数据库
查看当前数据库:db

什么是面向文档的数据库?

mongodb是一种面向文档的数据库:就是一个概念。
数据库 → 集合 → 文档 相对于关系型数据库:
数据库 → 表 → 记录

mongodb是无模式的数据库?

任何数据库以及任何集合无须创建直接就可以使用
如,向user数据库中的user集合中添加一条记录,如果在mysql中需要先创建数据库并设计表结构,但在mongodb无须创建任何东西直接执行:
use user –> 切换到user数据库
db.user.insert( {“user”:”Tom”, “age”: 10} ); –> 向user集合中添加一条记录

id字段

系统会为每一个记录添加一个_id字段,这个字段中的值确保了是整个系统中值是唯一的,相对于之前MYSQL中的主键。

增、删、改、查(CRUD)

新增- insert()
1. 向blog数据库中的user集合中添加一条记录
use blog –> 切换数据库
db.user.insert( {“username”:”Tom”} ) 注意字段区别大小写与数据库类型
如以下记录和上面记录不同因为Tom<>tom
db.user.insert( {“username”:”tom”} )
2. 查询记录 – find findOne(查询一条)
例1. 列出所user集合中的所有记录
db.user.find()
例2. 列出所年龄等于10岁所有的记录
db.user.find( {“age”:10} )
例3. 列出所年龄等于10岁并且姓名叫做“张三”所有的记录
db.userfind( {“age”:10 , “name”:”张三”} )

3. 删除 remove
例1. 删除user集合中所有的记录
db.user.remove() –> 删除所有记录时,索引还在。
db.user.drop() –> 删除user集合,速度更快,记录和索引都会被删除
例2。 删除所有年龄大于10岁的
db.user.remove( {“age”: {“$gt”:10} } )

4. 修改 update , save
例1. 修改年龄为10岁的第一条记录为20岁
方法一、
var d = db.user.findOne( {“age”:10} ) –> 先查询出来
d.age = 20 –> 修改年龄为20岁
db.user.save(d) –> 再存回去
方法二:
db.user.update( {“age”:10} , {$set:{“age”:30} })
常见错误:
db.user.update( {“age”:10} , {“age”:20} ) –> 不是修改年龄为20岁,把这条记录修改成 {“age”:20}这个样子,不只是修改age字段,而是修改了整条记录

注意:update默认只修改一条记录
db.user.update({“age”:20},{“$set”:{“age”:30}})–> 只会修改第一条记录,如果要修改所有的age=10的,需要设置第四个参数为true
db.user.update({“age”:20},{“$set”:{“age”:30}},false,true),当前版本是这样,但是以后的版本可能会改。

数据类型

可以想到的类型都可以存,函数、正则等。

Mongodb中的修改符

$lt,$gt,$ne等等(<,>,<>等)
例1. 查询出年龄不等于10岁所有的用户
db.user.find( { “age” : {“$ne” : 10} } )

mongodb中的翻页及优化

limit : 取前几条
skip : 跳过前几条
count : 查询记录数
db.user.find().count() –> 查询集合中所有的记录数
每页10条,取第3页的数据?
db.user.find().skip(20).limit(10)
翻页的优化(这个思路也适用于MYSQL数据库)
db.user.find().skip(1000).limit(10) 优化后:
db.user.find( {“id” : ”$gt”:1000} ).limit(10);
SELECT * FROM user LIMIT 1000,10这两语句,也取出了前1000条然后丢掉再取10条,因为也取前1000条所以性能不是很好。
SELECT * FROM user WHERE id > 1000 LIMIT 10

删除user数据库

use user
db.dropDatabase()

让PHP支持mongodb

PHP扩展下载地址:http://pecl.php.net/package/mongodb 或者 https://windows.php.net/downloads/pecl/releases/mongodb/(后面这个地址国内下载较快)

选择适合自己的扩展包:

将dll库放入php的ext目录,修改php.ini文件,加入extension=php_mongodb.dll,重启Apache或php-fpm。

PHP操作

添加数据:

  1. $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
  2. $bulk = new MongoDB\Driver\BulkWrite;
  3. $bulk->insert(
  4. [
  5. 'username' => "tom",
  6. 'age' => 29
  7. ]
  8. );
  9.  
  10. $manager->executeBulkWrite("test.site", $bulk);

删除数据:

  1. $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
  2. $bulk = new MongoDB\Driver\BulkWrite;
  3.  
  4. $bulk->delete(
  5. ['age' => 29],
  6. ['limit' => 1] //limit为1时,删除第一条匹配记录,为0时,删除所有匹配记录
  7. );
  8.  
  9. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
  10. $result = $manager->executeBulkWrite('test.site', $bulk, $writeConcern);

修改数据:

  1. $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
  2.  
  3. $bulk = new MongoDB\Driver\BulkWrite;
  4.  
  5. $bulk->update(
  6. [
  7. 'age' => 10
  8. ],
  9. ['$set' => [
  10. 'age' => 29
  11. ]],
  12. [
  13. 'multi' => false,
  14. 'upsert' => false
  15. ]
  16. );
  17. $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
  18. $result = $manager->executeBulkWrite('test.site', $bulk, $writeConcern);

查询数据:

  1. $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
  2. $filter = [
  3. 'age' => ['$gt' => 10] //在PHP中,$有特殊意义,这里只能使用单引号
  4. ];
  5. $options = [
  6. 'projection' => ['_id' => 0], //去掉_id
  7. 'sort' => ['age' => 1] //设置排序方式,-1倒序或者1正序
  8. ];
  9. $query = new MongoDB\Driver\Query($filter, $options);
  10. $cursor = $manager->executeQuery('test.site', $query);
  11. foreach ($cursor as $document){
  12. print_r($document);
  13. }

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Go