什么是NOSQL?
nosql(not only sql),指非关系型数据库。常见产品:mongodb,redix,memcache等。通常以key-val的形式存储数据。
特点:
- 操作简单、灵活
- 高并发时读写的性能优秀
- 可以分布式存储(便于扩展)
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操作
添加数据:
- $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
- $bulk = new MongoDB\Driver\BulkWrite;
- $bulk->insert(
- [
- 'username' => "tom",
- 'age' => 29
- ]
- );
-
- $manager->executeBulkWrite("test.site", $bulk);
删除数据:
- $manager = new MongoDB\Driver\Manager('mongodb://localhost:27017');
- $bulk = new MongoDB\Driver\BulkWrite;
-
- $bulk->delete(
- ['age' => 29],
- ['limit' => 1] //limit为1时,删除第一条匹配记录,为0时,删除所有匹配记录
- );
-
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
- $result = $manager->executeBulkWrite('test.site', $bulk, $writeConcern);
修改数据:
- $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
-
- $bulk = new MongoDB\Driver\BulkWrite;
-
- $bulk->update(
- [
- 'age' => 10
- ],
- ['$set' => [
- 'age' => 29
- ]],
- [
- 'multi' => false,
- 'upsert' => false
- ]
- );
- $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000);
- $result = $manager->executeBulkWrite('test.site', $bulk, $writeConcern);
查询数据:
- $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");
- $filter = [
- 'age' => ['$gt' => 10] //在PHP中,$有特殊意义,这里只能使用单引号
- ];
- $options = [
- 'projection' => ['_id' => 0], //去掉_id
- 'sort' => ['age' => 1] //设置排序方式,-1倒序或者1正序
- ];
- $query = new MongoDB\Driver\Query($filter, $options);
- $cursor = $manager->executeQuery('test.site', $query);
- foreach ($cursor as $document){
- }