PHP数据库操作四:mongodb用法分析


Posted in PHP onAugust 16, 2017

本文实例讲述了PHP数据库mongodb用法。分享给大家供大家参考,具体如下:

传统数据库中,我们要操作数据库数据都要书写大量的sql语句,而且在进行无规则数据的存储时,传统关系型数据库建表时对不同字段的处理也显得有些乏力,mongo应运而生,而且ajax技术的广泛应用,json格式的广泛接受,也使得mongo更贴近开发人员。

mongo简介及应用场景

MongoDB是一个面向文档的非关系型数据库(NoSQL),使用json格式存储。Mongo DB很好的实现了面向对象的思想(OO思想),在Mongo DB中 每一条记录都是一个Document对象。Mongo DB最大的优势在于所有的数据持久操作都无需开发人员手动编写SQL语句,直接调用方法就可以轻松的实现CRUD操作。

mongo能应用在如下场景:

存储大尺寸、低价值的数据
json及对象类型数据
网站缓存数据
评论、子评论类有明显从属关系数据
多服务器数据,其内置的MapReduce很容易现实全局遍历。

安装和使用mongodb

我们在官网 https://www.mongodb.org/ 上可以下载到其最新稳定版本 ,mongo是官方已经编译好的,解压后即可使用其命令都在bin目录下。

使用前首先配置mongo.conf文件

port=xxxxx         //代表端口号,如果不指定则默认为 27017 
dbpath=/usr/local/mongodb/db    //数据库路径
logpath=/usr/local/mongodb/logs/mongodb.log //日志路径
logappend=true        //日志文件自动累加,而不是覆盖
fork=ture         //以守护进程方式创建

数据库和数据表都可以直接创建,即不用切换,直接使用,使用时即创建,mongo里还可以直接写js脚本,可直接运行,mongo中如果不指定_id字段,mongo会自动添加一个。

mongo的各种命令

mongo的命令是其精髓,这些十分复杂的命令集合在一块,使得mongo的查询变得绚丽而高效。mongo内的每个表称作一个collection(集合),使用命令类似于MySQL,切换到数据库内直接对每一个collection操作。其命令由方法(func())、查询体(写在{}里)和操作符(由$开头)组成。

基本命令

show dbs        //查看数据库
use dbname        //切换到数据库
db.createCollection('collection')  //创建数据表
db.collection.drop()     //删除数据表
db.dropDatabase()      //删数据库
db.collection.insert({data})   //插入数据
db.collection.find()     //显示数据表内全部内容

查询体

{key.attr.attr:value}          //普通式
{key:{$ne|$gt|$gte|$lt|$lte|$in|$nin|$all:value}}   //key满足 $oper value的值
{$or|$and|$not|$nor:[{key1:{$gt:value}},{key2:{$ne:value}}]} //用$oper同时限定key1,key2的条件
{key:{$mod{8,2}}}           //取出key对8取余为2的值。
{key:{$exist:1}}           //取出key列存在的值。
{key:{$type:String|Double|Array|Date|Object|Boolean|......}}//查询key类型为type的列
{key:{$regex:/pattern/}}         //通过正则查询,效率较低
{$where:'this.attr.express.....'}       //直接用where语句,二进制转为JS运算,较慢

find()方法增强

db.collection.find(query,{要取出的列:1,不需要的列:0})  
db.collection.find(query).skip(跳过的行数).limit(限制信息条数);
db.collection.find(query).explain()   //与MYSQL的解释语句一样。
db.collection.remove(query,[justone]) //如不指定query,全部删除;[justone]默认为false意思是查询到多个,但只删一个。

update语句

db.collection.update(query,{key:newvalue}) //注意:新值会覆盖旧值,即数据只剩下语句中定义的key
db.collection.update(query,
{
 $set:{key:newvalue},
 $unset:{key:value},
 $rename:{key:value},
 $inc:{key:value},
 ......
},
{
 multi:true,  //改变所有符合条件的,默认为false
 upsert:true  //没有的话刚添加,默认为false
}
)

游标

var cursorName=db.collection.fund(query,...)[.skip(num).limit(num)] //创建游标
cursorName.hasNext()            //判断是否有下一个
printjson(cursorName.next())          //输出游标的下一个指向值
cursorName.forEach(function(Obj){process Obj})      //遍历操作游标

索引

db.collection.getIndexes()     //查看索引
db.collection.ensureIndex({key:1/-1[,key.attr:1/-1]},{unique:1(是否唯一)},{sparse:1(是否非空)})// 添加正序/倒序索引
db.collection.dropIndex({key:1/2})   //删除索引
db.collection.reIndex()   //重建用了很多出现杂乱的索引

MapReduce

MapReduce是mongo中内置的一个非常强大的遍历操作工具,使用它需要实现它的map和reduce两个函数

db.runCommand(
 {
  mapReduce: collection,    //要操作的数据表
  map: function(){emit(key1,key2)}, //对key1和key2进行数据映射
  reduce: function(key,value){},  //对key值和数据组value进行操作
  out: <output>,
  query: <document>,
  sort: <document>,
  limit: <number>,
  finalize: <function>,
  scope: <document>,
  jsMode: <boolean>,
  verbose: <boolean>
 }
)

更多更详细的命令可以在mongo的中文社区 http://docs.mongoing.com/manual-zh/ 找到。

mongo的用户、数据导入导出和集群

用户管理

MongoDB默认不开启授权。可以在开启服务器时添加 --auth 或者 --keyFile 选项开启授权。使用配置文件的话,使用 security.authorization 或 security.keyFile 设置。

MongoDB提供 自带角色, 每一个角色都为一种常见用例提供一个明确的作用。例如 read, readWrite, dbAdmin, 和 root 等角色。我们通过创建用户,创建角色,给用户分配/回收不同的角色来进行用户管理。

添加角色时要先在admin数据库中添加一个管理员角色,然后使用管理员角色在每个库添加不同的角色。

use admin;(切换到admin数据库,对此库操作)
db.createUser(
 {
 user: "username",
 pwd: "password",
 roles:
 [
  {
  role: "userAdminAnyDatabase",
  db: "admin"
  }
 ]
 }
)
use database;
db.auth('username','passwd');用超级管理员用户登陆后,整个mongo数据库皆可存取。

数据导入导出

我们使用mongo自带的工具进行导入导出,在mongo/bin目录下,最好导出csv格式,便于数据交换。

./mongoexport -d dataname -c tablename -f key1,key2 -q 'query' -o ainname --csv//导出数据,默认为json格式
./mongoimport -d dataname -c tablename --type json --file ./path //导入数据,默认为json格式

mongo数据库集群

1. 打开mongod时添加选项 --replSet replname;

2. 在mongo客户端连接上一个mongod进程,进入admin数据库,然后声明mongoconf变量:

use admin;
var rsconf={_id:'replname',members[{_id:0,host:'xxx'},{_id:1,host:'xxy'}]};

3. 用rs.initiatee(rsconf);来初始化集群,mongo会自动将id号小的设为primary,其他的mongod进程为secondary。

4. 连接secondary进程,使用slaveOk()函数,来初始化从进程。

PHP中操作mongo数据库

我们先为php添加mongo扩展(方法可看:https://3water.com/article/96829.htm)。然后,我们便可以在脚本中使用mongo类函数库了。

不同于其他的类库只有一个核心类,mongo有四个类,分别是:

Mongo类,基础类,拥有连接、关闭连接、对全局数据库的操作方法。
mongoDB类,邮Mongo类通过selectDB()方法得到,拥有表级的操作方法。
MongoCollection类,一般由Mongo->dbname->collection或直接用MongoDB类和数据库名实例化得到,拥有对数据的基本操作。
MongoCursor类,由MongoCollection通过find()方法得到,拥有普通的游标遍历操作。

以下是一个典型的mongo操作:

$mongo=new Mongo();
$mongo->connect('host',port);
$collection=$mongo->dbname->collection;
$cursor=$collection->find();
$cursor->operate();
$mongo->close();

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
将RTF格式的文件转成HTML并在网页中显示的代码
Oct 09 PHP
PHP新手上路(十)
Oct 09 PHP
PHP面向对象教程之自定义类
Jun 10 PHP
php防止sql注入之过滤分页参数实例
Nov 03 PHP
PHP中使用socket方式GET、POST数据实例
Apr 02 PHP
基于PHP实现的事件机制实例分析
Jun 18 PHP
百万级别知乎用户数据抓取与分析之PHP开发
Sep 28 PHP
比较完整的微信开发php代码
Aug 02 PHP
PHP编程快速实现数组去重的方法详解
Jul 22 PHP
360搜索引擎自动收录php改写方案
Apr 28 PHP
php实现微信支付之现金红包
May 30 PHP
php使用自带dom扩展进行元素匹配的原理解析
May 29 PHP
PHP Laravel 上传图片、文件等类封装
Aug 16 #PHP
PHP数据库操作三:redis用法分析
Aug 16 #PHP
PHP数据库操作二:memcache用法分析
Aug 16 #PHP
PHP数据库编程之MySQL优化策略概述
Aug 16 #PHP
PHP回调函数与匿名函数实例详解
Aug 16 #PHP
搭建自己的PHP MVC框架详解
Aug 16 #PHP
Laravel使用支付宝进行支付的示例代码
Aug 16 #PHP
You might like
PHP XML操作的各种方法解析(比较详细)
2010/06/17 PHP
基于python发送邮件的乱码问题的解决办法
2013/04/25 PHP
PHP管理依赖(dependency)关系工具 Composer 安装与使用
2014/08/18 PHP
PHP微信公众号开发之微信红包实现方法分析
2017/07/14 PHP
关于锚点跳转及jQuery下相关操作与插件
2012/10/01 Javascript
Node.js实现批量去除BOM文件头
2014/12/20 Javascript
jquery实现的动态回到顶部特效代码
2015/10/28 Javascript
利用Javascript裁剪图片并存储的简单实现
2017/03/13 Javascript
详解nodejs微信jssdk后端接口
2017/05/25 NodeJs
jquery实现楼层滚动效果
2018/01/01 jQuery
vue.js与element-ui实现菜单树形结构的解决方法
2018/04/21 Javascript
微信小程序云开发之使用云函数
2019/05/17 Javascript
移动端底部导航固定配合vue-router实现组件切换功能
2019/06/13 Javascript
Vue-cli项目部署到Nginx服务器的方法
2019/11/01 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
[05:22]DOTA2 2015国际邀请赛中国区预选赛首日TOP10
2015/05/26 DOTA
Python爬虫之模拟知乎登录的方法教程
2017/05/25 Python
Python获取系统所有进程PID及进程名称的方法示例
2018/05/24 Python
Python简单爬虫导出CSV文件的实例讲解
2018/07/06 Python
python 实现调用子文件下的模块方法
2018/12/07 Python
Python、 Pycharm、Django安装详细教程(图文)
2019/04/12 Python
python实现桌面气泡提示功能
2019/07/29 Python
Python 调用 Windows API COM 新法
2019/08/22 Python
基于TensorBoard中graph模块图结构分析
2020/02/15 Python
Pycharm编辑器功能之代码折叠效果的实现代码
2020/10/15 Python
详解基于Facecognition+Opencv快速搭建人脸识别及跟踪应用
2021/01/21 Python
GANT英国官方网上商店:甘特衬衫
2018/02/06 全球购物
HomeAway英国:全球领先的度假租赁在线市场
2020/02/03 全球购物
什么是事务?事务有哪些性质?
2012/03/11 面试题
汽车电子与维修专业大学生求职信
2013/09/28 职场文书
中专毕业生自我鉴定
2013/11/21 职场文书
开办饭店创业计划书
2013/12/28 职场文书
学校安全检查制度
2014/01/27 职场文书
党员教师个人对照检查材料(群众路线)
2014/09/26 职场文书
MySQL root密码的重置方法
2021/04/21 MySQL