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 相关文章推荐
MayFish PHP的MVC架构的开发框架
Aug 13 PHP
仿AS3实现PHP 事件机制实现代码
Jan 27 PHP
基于php无限分类的深入理解
Jun 02 PHP
PHP使用内置dir类实现目录遍历删除
Mar 31 PHP
php递归删除指定文件夹的方法小结
Apr 20 PHP
PHP实现过滤各种HTML标签
May 17 PHP
PHP Curl模拟登录微信公众平台、新浪微博实例代码
Jan 28 PHP
php运行报错Call to undefined function curl_init()的最新解决方法
Nov 20 PHP
基于php中echo用逗号和用点号的区别详解
Jan 23 PHP
PHP生成腾讯云COS接口需要的请求签名
May 20 PHP
Laravel重定向,a链接跳转,控制器跳转示例
Oct 22 PHP
PHP中mysqli_get_server_version()的实例用法
Feb 03 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
PHP5 安装方法
2006/10/09 PHP
PHP 开源框架22个简单简介
2009/08/24 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
2013/07/18 PHP
免费手机号码归属地API查询接口和PHP使用实例分享
2014/04/10 PHP
Yii框架视图、视图布局、视图数据块操作示例
2019/10/14 PHP
Js-$.extend扩展方法使方法参数更灵活
2013/01/15 Javascript
js中数组Array的一些常用方法总结
2013/08/12 Javascript
利用jq让你的div居中的好方法分享
2013/11/21 Javascript
innerHTML在IE中报错解决方案
2014/12/15 Javascript
javascript实现模拟时钟的方法
2015/05/13 Javascript
JS的框架Polymer中的dom-if和is属性使用说明
2015/07/29 Javascript
js中不同的height, top的区别对比
2015/09/24 Javascript
Vuejs第十三篇之组件——杂项
2016/09/09 Javascript
html、css和jquery相结合实现简单的进度条效果实例代码
2016/10/24 Javascript
jQuery插件echarts实现的去掉X轴、Y轴和网格线效果示例【附demo源码下载】
2017/03/04 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
使用jquery的cookie实现登录页记住用户名和密码的方法
2019/03/13 jQuery
python迭代器与生成器详解
2016/03/10 Python
Python检测网站链接是否已存在
2016/04/07 Python
Python OpenCV读取png图像转成jpg图像存储的方法
2018/10/28 Python
python把1变成01的步骤总结
2019/02/27 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
2020/04/27 Python
Django+Celery实现动态配置定时任务的方法示例
2020/05/26 Python
基于Python实现简单学生管理系统
2020/07/24 Python
通过css3动画和opacity透明度实现呼吸灯效果
2019/08/09 HTML / CSS
土耳其国际性时尚购物网站:Modanisa
2018/01/19 全球购物
软件缺陷的分类都有哪些
2014/08/22 面试题
投标担保书范文
2014/04/02 职场文书
《四季》教学反思
2014/04/08 职场文书
儿童生日会策划方案
2014/05/15 职场文书
安全宣传标语口号
2014/06/06 职场文书
中专生自荐信
2014/06/25 职场文书
财务人员个人工作总结
2015/02/27 职场文书
商场广播稿范文
2015/08/19 职场文书
Java elasticsearch安装以及部署教程
2021/06/28 Java/Android
nginx七层负载均衡配置详解
2022/07/15 Servers