本文目录一览:
mongodb 3.2怎么在php中连接
表标PHP已经自带了mongo功能,你就可以操作下面的代码(但是你必须有安装mongodb服务器)
一、连接数据库
使用下面的代码创建一个数据库链接
复制代码 代码如下:
?php
$connection = new Mongo(mongodb://192.168.1.5:27017); //链接到 192.168.1.5:27017//27017端口是默认的。
$connection = new Mongo( "example.com" ); //链接到远程主机(默认端口)
$connection = new Mongo( "example.com:65432" ); //链接到远程主机的自定义的端口
print_r($connection-listDBs());//能打印出数据库数组,看看有几个数据库。
?
如图:
上图说有一个数据库名字叫local,总大小1个字节,他是空的。看见ok表示运行成功。
现在你可以使用$connection链接来操作数据库了
选择数据库
使用下面的代码来选择一个数据库
复制代码 代码如下:
?php
$db = $connection-dbname;
?
这里的数据库并不一定是一个已经存在的数据库,如果所选择的数据库不存在,则会新建一个数据库,所以在选择数据库的时候,注意一定要填上正确的数据库名
如果拼写错误的话,很有可能会新建一个数据库
复制代码 代码如下:
?php
$db = $connection-mybiglongdbname;
//做一些事情
$db = $connection-mybiglongdbnme;
//现在会连上一个新的数据库
?
获取一个集合
获取一个集合跟选择数据库拥有相同的语法格式
复制代码 代码如下:
?php
$db = $connection-baz;//选择数据库
$collection = $db-foobar;//选择foobar集合
//或者使用更简洁的方式
$collection = $connection-baz-foobar;
?
插入一个文档
多维数组是可以被储存到数据库中的基本单元
一个随机的文档可能是这样
复制代码 代码如下:
?php
$doc = array(
”name” = “MongoDB”,
“type” = “database”,
“count” = 1,
“info” = (object)array( “x” = 203,
“y” = 102),
“versions” = array(“0.9.7″, “0.9.8″, “0.9.9″)
);
?
注意:你可以嵌套数组与对象,对象与文档在mongodb中几乎是一样的,你可以使用$doc调用一个文档或对象,但是info字段总是一个对象而不是一个文档,
本约束适用于所有文档
使用MongoCollection::insert()插入一个文档
复制代码 代码如下:
?php
$m = new Mongo();
$collection = $m-foo-bar;
$collection-insert($doc);
?
mongodb 的 insert()、save() ,区别主要是:若存在主键,insert() 不做操作,而save() 则更改原来的内容为新内容。
存在数据: { _id : 1, " name " : " n1 " }
insert({ _id : 1, " name " : " n2 " }) 会提示错误
save({ _id : 1, " name " : " n2 " }) 会把 n1 改为 n2 。
使用MongoCollection::findOne()查询文档
为了证明上面那段代码的数据已经插入到数据库里了,我们进行简单的 findOne()操作以得到集合中的第一个文档数据,这种方法只返回一个文档数据,
这种方法适用于在你的查询语句的时候只匹配一个文档或者你只关心第一条数据
复制代码 代码如下:
?php
$obj = $collection-findOne();
var_dump( $obj );
?
你会看到下列结果
复制代码 代码如下:
array(5) {
["_id"]=
object(MongoId)#6 (0) {
}
["name"]
string(7) “MongoDB”
["type"]=
string(8) “database”
["count"]=
int(1)
["info"]=
array (2) {
["x"]=
int(203)
["y"]=
int(102)
}
["versions"]
array(3) {
[0]=
string(5) “0.9.7″
[1]=
string(5) “0.9.8″
[2]=
string(5) “0.9.9″
}
}
注意_id字段自动加载了文档上,MongoDB储存元素中以_以及$开头的都是供内部使用的
添加更多文档
为了做一些更有趣的事情,我们添加更多简单的文档到集合中,这些文档如下
复制代码 代码如下:
?php
array( “i” = value );
?
我们可以使用循环相当有效的插入数据
复制代码 代码如下:
?php
for($i=0; $i100; $i++) {
$collection-insert( array( “i” = $i ) );
}
?
注意:我们可以插入不同的字段在同一字符集中,在这方面意味着MongoDB拥有非常自由的储存模式
在一个集合中计算文档的数量
现在我们插入了101个文档(我们用循环插入了100个,之前还插入了一个),我们可以使用count()来看看我们的数据是不是都被插入进去了
复制代码 代码如下:
?php
echo $collection-count();
?
这段代码将打印出101
MongoCollection::count() 也可以查询字段数据
使用游标得到集合中的所有文档
为了得到集合中的所有文档,我们可以使用 MongoCollection::find()方法,find()方法返回一个 MongoCursor对象,可以让我们重复得到查询所匹配的的文档
复制代码 代码如下:
?php
$cursor = $collection-find();
foreach ($cursor as $id = $value) {
echo “$id: “;
var_dump( $value );
}
?
这样我们会打印出集合中的这101个文档,$id就是文档中的_id字段,$value 就是文档本身
为查询规定一个标准
我们可以通过find()方法得到集合中的文档子集,例如,我们要查询出集合中i字段为71的文档,我们可以使用下列方法
复制代码 代码如下:
?php
$query = array( “i” = 71 );
$cursor = $collection-find( $query );
while( $cursor-hasNext() ) {
var_dump( $cursor-getNext() );
}
?
我们将打印如下数据
复制代码 代码如下:
array(2) {
["_id"]=
object(MongoId)#6 (0) {
}
["i"]=
int(71)
["_ns"]=
“testCollection”
}
为查询设定一个范围
我们可以通过find()创建一个查询语句以得集合中的一个子集,例如如果我们得到所有”i”50的文档,我们可以使用如下代码
复制代码 代码如下:
?php
$query = array( “i” = array(‘$gt' =50)); //注意'$gt'两边的单引号
$cursor = $coll-find( $query );
while( $cursor-hasNext() ) {
var_dump( $cursor-getNext() );
}
?
我们同样可以得到20 i = 30之间的数据
复制代码 代码如下:
?php
$query = array( “i” = array( “\$gt” = 20, “\$lte” = 30 ) );
$cursor = $coll-find( $query );
while( $cursor-hasNext() ) {
var_dump( $cursor-getNext() );
}
?
我们非常容易漏掉$美元符号,你也可以选择你自定义的符号来代替美元符号,选择一个不会在你的建里面出现的符号例如”:”,在php.ini中加上这么一句话
复制代码 代码如下:
mongo.cmd = “:”
那么上面的代码就可以替换成
复制代码 代码如下:
?php
$query = array( “i” = array( “:gt” = 20, “:lte” = 30 ) );
?
当然你也可以使用ini_set(“mongo.cmd”, “:”)的方法来改变
创建一个索引
MongoDB支持索引,并且可以很容易的加到一个集合中,你只要指定某个字段为索引就行了,并且还可以指定 正序索引(1)与 倒序索引(-1)
下面的代码为I创建了索引
复制代码 代码如下:
?php
$coll-ensureIndex( array( “i” = 1 ) ); //在”i”上创建了一个索引
$coll-ensureIndex( array( “i” = -1, “j” = 1 ) );//在”i”上创建了倒序索引 在”j”上创建了正序索引
?
一个完整的简单例子
这个例子展示了如何链接mongodb数据库,如何选择数据库,如何插入数据,如何查询数据,以及关闭数据库链接
复制代码 代码如下:
?php
//链接
$m = new Mongo();
// 选择一个数据库
$db = $m-comedy;
$collection = $db-cartoons;
//添加一个元素
$obj = array( "title" = "Calvin and Hobbes", "author" = "Bill Watterson" );
$collection-insert($obj);
//修改
$newdata = array('$set' = array("title" = "Calvin and Hobbes"));
$collection-update(array("author" = "caleng"), $newdata);
//删除
$collection-remove(array('author'='caleng'), array("justOne" = true));
//添加另一个元素,使用不同的格式
$obj = array( "title" = "XKCD", "online" = true );
$collection-insert($obj);
//查询所有的集合
$cursor = $collection-find();
//重复显示结果
foreach ($cursor as $obj) {
echo $obj["title"] . "\n";
}
// 关闭链接
$m-close();
?
输出结果为
复制代码 代码如下:
Calvin and Hobbes
XKCD
mongoDB分片集群
集群 》 片 》 块 》 文档
一个集群由多个分片组成,一个分片存储了多个块(逻辑上的数据分块),一个快包含了多个文档,文档不是最小的单位,文档存了一个个的字段,一个字段或者多个字段可以组成一个片键
片键决定数据可以分成多少块
配置表里存的数据分布范围是怎么定的?
数据在逻辑上被分成了4块,加入系统存的是公司用户信息,按照年龄来分,18-60,一个年龄一个分块,最大可以分43块,在把块分到多个分片上,但是容易造成22-25的用户数据显得特别大,导致了热点片的情况-phpmongodb集群连接
片键不是连续的而是通过hash散列到不同的片区,解决了数据不均匀的情况,但是范围查询效率低,需要遍历全部的分片才能满足业务查询,用户的订单系统,按照下单用户id去做hash,这样不同用户的订单数据就会被均匀分到不同的分片,单查某个用户的订单数据是非常高效的,但是根据时间范围去查就要扫描全部分片-phpmongodb集群连接
根据地域去划分
切割器:可以对某个源分片的数据按chunk去做切割
平衡器:
当某些分片数据不均匀的情况下,平衡器就发挥作用了,他会发出一个命令让切割器去需要移动的分片上去做数据切割,再把数据移动到数据少的分片上。具体的步骤如下:
平衡器向源分片发送moveChunk的命令
源分片收到命令后,会启动自己内部的一个moveChunk命令,如果在数据移动过程中有客户端发来读写请求的话,都会发送到源分片。(因为配置服务器上的元数据还没有改变)
目标片开始向源分片请求将要移动的数据块的文档,准备拷贝文档数据。
当目标分片接收到据块的最后一个文档后,目标分片会启动一个同步进程来检查,是否已经拷贝完全部的文档。
当同步完成后,目标分片会连接配置服务器,更新元数据列表中数据块的地址。
当目标分片完成元数据更新后,源分片就会删除原来的数据块.如果有新的数据块需要移动的话,可以继续进行移动。
配置服务器会通知monogs进程更新自己的映射表。
数据容量日益增长,访问性能降低
MongoDB分片集群搭建
分片(sharding)是一种跨多台机器分布数据的方法,MongoDB使用分片来支持具有非常大的数据集和高吞吐量操作的部署。换句话说:分片就是将数据拆分,将其分散存在不同的机器上的过程,将数据分散到不同的机器上,不需要功能强大的大型计算机就可以存储更多的数据,处理更多的负载。-phpmongodb集群连接
MongoDB分片集群包含以下组件:
下图描述了分片集群中组件的交互:
本文搭建的副本集集群是两个分片节点副本集(3+3)+一个配置节点副本集(3)+两个路由节点(2),共11个服务节点,具体如下图所示:
本次搭建一主一副本一仲裁,相关的配置文件、数据、日志都放在sharded_cluster相应的子目录下面,具体步骤如下:
myshardrs01
设置sharding.clusterRole需要mongod实例运行复制。 要将实例部署为副本集成员,请使用
replSetName设置并指定副本集的名称。
使用客户端命令连接主节点,这里最好连接主节点
执行初始化副本集命令:
查看副本集情况:
同样搭建一主一副本一仲裁,相关的配置文件、数据、日志都放在sharded_cluster相应的子目录下面,
具体步骤如下:
myshardrs02
myshardrs01_27318
设置sharding.clusterRole需要mongod实例运行复制。 要将实例部署为副本集成员,请使用
replSetName设置并指定副本集的名称
myshardrs01_27418
myshardrs01_27518
启动第二套副本集:一主一副本一仲裁
依次启动三个mongod服务:
查看服务是否启动:
新建或修改配置文件:
myconfigrs_27019:
新建或修改配置文件:
myconfigrs_27119
新建或修改配置文件:
myconfigrs_27219
依次启动配置的mongod副本集:一主两副本
查看服务是否启动: