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 相关文章推荐
PHP的中问验证码
Nov 25 PHP
比较discuz和ecshop的截取字符串函数php版
Sep 03 PHP
深入解析PHP中的(伪)多线程与多进程
Jul 01 PHP
laravel 5 实现模板主题功能(续)
Mar 02 PHP
ThinkPHP 3.2 版本升级了哪些内容
Mar 05 PHP
Laravel 5框架学习之路由、控制器和视图简介
Apr 07 PHP
php截取指定2个字符之间字符串的方法
Apr 15 PHP
php查找字符串中第一个非0的位置截取
Feb 27 PHP
PHP使用SWOOLE扩展实现定时同步 MySQL 数据
Apr 09 PHP
PHP在弹框中获取foreach中遍历的id值并传递给地址栏
Jun 13 PHP
PHP实现的策略模式简单示例
Aug 25 PHP
PHP ajax+jQuery 实现批量删除功能实例代码小结
Dec 06 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判断变量类型常用方法
2012/04/24 PHP
PHP使用CURL获取302跳转后的地址实例
2014/05/04 PHP
CI映射(加载)数据到view层的方法
2016/03/28 PHP
php基于jquery的ajax技术传递json数据简单实例
2016/04/15 PHP
php cookie工作原理与实例详解
2016/07/18 PHP
phpStudy2016 配置多个域名期间遇到的问题小结
2017/10/19 PHP
PHP实现微信提现功能(微信商城)
2019/11/21 PHP
ExtJS GTGrid 简单用户管理
2009/07/01 Javascript
Jquery Ajax学习实例5 向WebService发出请求,返回泛型集合数据的异步调用
2010/03/17 Javascript
js实现可得到不同颜色值的颜色选择器实例
2015/02/28 Javascript
JavaScript设置表单上传时文件个数的方法
2015/08/11 Javascript
jQuery Easyui 验证两次密码输入是否相等
2016/05/13 Javascript
javascript中异常处理案例(推荐)
2016/10/03 Javascript
webpack+vue.js快速入门教程
2016/10/12 Javascript
jquery延迟对象解析
2016/10/26 Javascript
vue单页缓存方案分析及实现
2018/09/25 Javascript
Vue引入Stylus知识点总结
2020/01/16 Javascript
详解vue高级特性
2020/06/09 Javascript
[39:21]LGD vs OG 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.24
2019/09/10 DOTA
Python import用法以及与from...import的区别
2015/05/28 Python
python 读文件,然后转化为矩阵的实例
2018/04/23 Python
Pytorch中的variable, tensor与numpy相互转化的方法
2019/10/10 Python
Python aiohttp百万并发极限测试实例分析
2019/10/26 Python
基于python2.7实现图形密码生成器的实例代码
2019/11/05 Python
Python爬虫headers处理及网络超时问题解决方案
2020/06/19 Python
Linux安装Python3如何和系统自带的Python2并存
2020/07/23 Python
玖熙女鞋美国官网:Nine West
2016/10/06 全球购物
Perry Ellis官网:美国男士品味服装
2016/12/09 全球购物
大学秋游活动方案
2014/02/11 职场文书
服装采购员岗位职责
2014/03/15 职场文书
幼儿园欢迎词范文
2015/01/26 职场文书
学术会议通知范文
2015/04/15 职场文书
2015小学教育教学工作总结
2015/07/21 职场文书
安全事故隐患排查治理制度
2015/08/05 职场文书
接收函
2019/04/22 职场文书
详细分析PHP7与PHP5区别
2021/06/26 PHP