PHP与MongoDB的操作

f7mm 贡献于2013-04-30

作者   创建于2011-10-26 14:17:34   修改者  修改于1899-12-30 00:00:00字数7225

文档摘要:PHP与MongoDB的操作
关键词:

****************** PHP与MongoDB的操作 时间:2011-10-25 ****************** 在php的mongo扩展中,提供了4类接口(对象): 1,针对mongoDB连接的操作:Mongo http://us.php.net/manual/en/class.mongo.php 2,针对mongoDB中数据库的操作:MongoDB http://us.php.net/manual/en/class.mongodb.php 3,针对mongoDB中collection的操作:MongoCollection http://us.php.net/manual/en/class.mongocollection.php 4,针对查询结果集的操作:MongoCursor http://us.php.net/manual/en/class.mongocursor.php 1.PHP连接MongoDB 直接实例化mongo类+创建连接: $mo = new Mongo();//得到一个Mongo连接对象 实例化了一个Mongo类,并且与默认的localhost:27017端口的mongoDB建立连接。 如果想连接到其他的主机,可以这样写:$mongo = new Mongo("mongodb://username:password@192.168.1.22:12345"); 另外一种方式,实例化mongo类,再手动建立连接: $mongo = new Mongo("mongodb://username:password@192.168.1.22:12345",array('connect'=>false));//初始化类 $mongo->connect();//创建连接 Mongo类中有用的一些方法: Mongo::listDBs() http://us.php.net/manual/en/mongo.listdbs.php 返回一个包含当前mongo服务上的库(DB)信息的数组。 $mo = new Mongo(); $dbs = $mo->listDBs();//获得一个包含db信息的数组 Mongo::selectCollection($db,$coll) http://us.php.net/manual/en/mongo.selectcollection.php 返回一个当前连接下的某db中的collection对象。 $mo = new Mongo(); $coll = $mo->selectCollection(’db’,'mycoll’);//得到一个collection对象 选择想要的数据库(Mongo类): 一种方式: http://us.php.net/manual/en/mongo.get.php $mongo = new Mongo(); $db = $mongo->foo;//得到一个MongoDB对象 另一种方式: http://us.php.net/manual/en/mongo.selectdb.php $mongo = new Mongo(); $db = $mongo->selectDB(’foo’);//得到一个MongoDB对象 MongoDB中有用的函数: 创建一个MongoDB对象 http://us.php.net/manual/en/mongodb.construct.php $mo = new Mongo(); $db = new MongoDB($mo,’dbname’);//通过创建方式获得一个MongoDB对象 删除当前DB http://us.php.net/manual/en/mongodb.drop.php $db = $mo->dbname; $db->drop(); 获得当前数据库名 http://us.php.net/manual/en/mongodb.–tostring.php $db = $mo->dbname; $db->_tostring(); 选择想要的collection: A: $mo = new Mongo(); $coll = $mo->dbname->collname;//获得一个collection对象 B: $db = $mo->selectDB(’dbname’); $coll = $db->collname; C: $db = $mo->dbname; $coll = $db->selectCollectoin(’collname’);//获得一个collection对象 2.PHP对MongoDB的数据插入操作 http://us.php.net/manual/en/mongocollection.insert.php MongoCollection::insert(array $a,array $options) array $a 要插入的数组 array $options 选项 safe 是否返回操作结果信息 fsync 是否直接插入到物理硬盘 例程: $coll = $mo->db->foo; $a = array(’a'=>’b'); $options = array(’safe’=>true); $rs =$coll->insert($a,$options); $rs为一个array型的数组,包含操作信息 3.PHP对MongoDB的数据删除操作 http://us.php.net/manual/en/mongocollection.remove.php MongoCollection::remove(array $criteria,array $options) array $criteria 条件 array $options 选项 safe 是否返回操作结果 fsync 是否是直接影响到物理硬盘 justOne 是否只影响一条记录 例程: $coll = $mo->db->coll; $c = array(’a'=>1,’s’=>array(’$lt’=>100)); $options = array(’safe’=>true); $rs = $coll->remove($c,$options); $rs为一个array型的数组,包含操作信息 4.PHP对MongoDB的数据更新操作 http://us.php.net/manual/en/mongocollection.update.php MongoCollection::update(array $criceria,array $newobj,array $options) array $criteria 条件 array $newobj 要更新的内容 array $options 选项 safe 是否返回操作结果 fsync 是否是直接影响到物理硬盘 upsert 是否没有匹配数据就添加一条新的 multiple 是否影响所有符合条件的记录,默认只影响一条 例程: $coll = $mo->db->coll; $c = array(’a'=>1,’s’=>array(’$lt’=>100)); $newobj = array(’e'=>’f',’x'=>’y'); $options = array(’safe’=>true,’multiple’=>true); $rs = $coll->update($c,$newobj,$options); $rs为一个array型的数组,包含操作信息 因为mongoDB的update方法有很多与no-sql不同的地方,所以把它单独拿出来讨论。 php的mongoDB之update方法中 只谈到了php方法和语法, http://www.php.net/manual/en/mongocollection.update.php 但这是远远不够的。 mongoDB的官方手册中: 只提到了command方式的写法 http://www.mongodb.org/display/DOCS/Updating 没有php的具体实做方法。 在学习和实践中,要把两个手册结合起来用。 $inc 如果记录的该节点存在,让该节点的数值加N;如果该节点不存在,让该节点值等于N 设结构记录结构为 array(’a'=>1,’b'=>’t'),想让a加5,那么: $coll->update( array(’b'=>’t'), array(’$inc’=>array(’a'=>5)), ) $set 让某节点等于给定值 设结构记录结构为 array(’a'=>1,’b'=>’t'),b为加f,那么: $coll->update( array(’a'=>1), array(’$set’=>array(’b'=>’f')), ) $unset 删除某节点 设记录结构为 array(’a'=>1,’b'=>’t'),想删除b节点,那么: $coll->update( array(’a'=>1), array(’$unset’=>’b'), ) $push 如果对应节点是个数组,就附加一个新的值上去;不存在,就创建这个数组,并附加一个值在这个数组上;如果该节点不是数组,返回错误。 设记录结构为array(’a'=>array(0=>’haha’),’b'=>1),想附加新数据到节点a,那么: $coll->update( array(’b'=>1), array(’$push’=>array(’a'=>’wow’)), ) 这样,该记录就会成为:array(’a'=>array(0=>’haha’,1=>’wow’),’b'=>1) $pushAll 与$push类似,只是会一次附加多个数值到某节点 $addToSet 如果该阶段的数组中没有某值,就添加之 设记录结构为array(’a'=>array(0=>’haha’),’b'=>1),如果想附加新的数据到该节点a,那么: $coll->update( array(’b'=>1), array(’$addToSet’=>array(’a'=>’wow’)), ) 如果在a节点中已经有了wow,那么就不会再添加新的,如果没有,就会为该节点添加新的item——wow。 $pop 设该记录为 array(’a'=>array(0=>’haha’,1=>’wow’),’b'=>1) 删除某数组节点的最后一个元素: $coll->update( array(’b'=>1), array(’$pop=>array(’a'=>1)), ) 删除某数组阶段的第一个元素 $coll->update( array(’b'=>1), array(’$pop=>array(’a'=>-1)), ) $pull 如果该节点是个数组,那么删除其值为value的子项,如果不是数组,会返回一个错误。 设该记录为 array(’a'=>array(0=>’haha’,1=>’wow’),’b'=>1),想要删除a中value为haha的子项: $coll->update( array(’b'=>1), array(’$pull=>array(’a'=>’haha’)), ) 结果为: array(’a'=>array(0=>’wow’),’b'=>1) $pullAll 与$pull类似,只是可以删除一组符合条件的记录。 5.PHP对MongoDB的数据查询操作 Mongodb对于随机生成的_id字段也是可以查询的,方法new MongoId("xxxxxxxx"); 同时MongoDB支持正则表达式,new MongoRegex("/^.*........./"); 查询collection获得单条记录(MongoCollection类): http://us.php.net/manual/en/mongocollection.findone.php array MongoCollection::findOne(array $query,array $fields) array $query 条件 array $fields 要获得的字段 例程: $coll = $mo->db->coll; $query = array(’s’=>array(’$lt’=>100)); $fields = array(’a'=>true,’b'=>true); $rs = $coll->findOne($query,$fields); 如果有结果就返回一个array,如果没有结果就返回NULL 查询collection获得多条记录(MongoCollection类): http://us.php.net/manual/en/mongocollection.find.php MongoCursor MongoCollection::find(array $query,array $fields) array $query 条件 array $fields 要获得的字段 例程: $coll = $mo->db->coll; $query = array(’s’=>array(’$lt’=>100)); $fields = array(’a'=>true,’b'=>true); $cursor = $coll->find($query,$fields); 返回一个游标记录对象MongoCursor。 针对游标对象MongoCursor的操作(MongoCursor类): http://us.php.net/manual/en/class.mongocursor.php 循环或的结果记录: $cursor = $coll->find($query,$fields); while($cursor->hasNext()){ $r = $cursor->getNext(); var_dump($r); } 或者 $cursor = $coll->find($query,$fields); foreache($cursor as $k=>$v){ var_dump($v); } 或者 $cursor = $coll->find($query,$fields); $array= iterator_to_array($cursor); 一个血的教训: http://us.php.net/manual/en/mongocursor.snapshot.php 详见 不断变化的MongDB结果集 在我们做了find()操作,获得$cursor游标之后,这个游标还是动态的,也就是在我获得游标到我循环操作完成对应记录的过程中,默认情况下,这对符合条件的记录如果增加,结果集也会自动增加。换句话说,在我find()之后,到我的游标循环完成这段时间,如果再有符合条件的记录被插入到collection,那么这些记录也会被$cursor获得。 如果你想在获得$cursor之后的结果集不变化,需要这样做: $cursor = $coll->find($query,$fields); $cursor->snapshot(); foreache($cursor as $k=>$v){ var_dump($v); } MongoDB中,经过php来做的所有的操作指令都是用array来包裹的: MongoCollection::update ( array $criteria , array $newobj [, array $options = array() ] ) public MongoCursor MongoCollection::find ([ array $query = array() [, array $fields = array() ]] ) public array MongoCollection::findOne ([ array $query = array() [, array $fields = array() ]] ) public mixed MongoCollection::remove ( array $criteria [, array $options = array() ] ) 以上四项中,加粗部分,其实都是要我们来填写查询条件的位置。 一个简单的示例: $query = array(’a'=>’hello’); $coll->find($query); 查询该collection中所有a等于hello的记录。 也可以复合来做: $query = array(’a'=>’hello’,'b’=>1); $coll->find($query); 查询该collection中所有a等于hello并且b为1的记录。 关于大于和小于等查询条件: $query = array(’a'=>’hello’,'b’=>array(’$gt’=>10)); $coll->find($query); 查询该collection中所有a等于hello并且b大于10的记录。 更多的大小比对为:$gt为大于、$gte为大于等于、$lt为小于、$lte为小于等于、$ne为不等于 PHP与MONGODB的结果集操作 MongoCursor MongoCollection::find(array $query,array $fields) 第一步用find()来获取符合条件的结果,第二步才是分页、排序、分组等等。 获得结果数量: http://www.php.net/manual/en/mongocursor.count.php $cursor = $cull->find(); $count = $cursor->count(); 对结果集排序: http://www.php.net/manual/en/mongocursor.sort.php $cursor = $cull->find(); $cursor = $cursor->sort(array("a" => 1)); 分页获取结果集: http://www.php.net/manual/en/mongocursor.skip.php http://www.php.net/manual/en/mongocursor.limit.php $cursor = $cull->find(); $cursor = $cursor->sort(array("a" => 1)); $cursor = $cursor->skip(10)->limiti(20);

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 2 人已下载

下载文档