标题:PHP操作MongoDB学习 出处:BIWEB开源PHP WMS系统创始人ArthurXF肖飞的blog 时间:Fri, 26 Oct 2012 11:21:05 +0000 作者:ArthurXF 地址:http://www.bizeway.net/read.php/606.htm 内容: 1   mongodb启动时,设置启动项 C:\>mongodb\bin\mongod  --config C:\mongodb.conf 其中mongodb.conf为:     dbpath = D:\mongodb_data        logpath  = D:\mongodb.log          logappend  = true 如果是linux的话,则mongod  --config /etc/mongodb.conf 2  停止server     db.shutdownServer() 3  常用操作:    use myfirstdb   插入db    db.movies.insert({name:"Source Code", genre:"sci-fi", year:2011})    查找所有记录    db.movies.find() 4  . PHP MongoDB 扩展安装   php 5.2 mongo driver下载: http://downloads.mongodb.org/mongo-latestphp5.2vc6ts. zip   5.3 mongo driver下载:   http://downloads.mongodb.org/mongo-latest-php5.3vc6ts.zip    把DLL复制到extension目录,然后 extension=php_mongo.dll即可 5  列出当前数据库的php mongodb程序 listDBs(); //List all databases echo '
';  print_r($databases);  $mongo->close(); } catch(MongoConnectionException $e) {  //handle connection error  die($e->getMessage()); } ?> 



如果是连接时用不同的端口,构造函数中用: $mongo  = new Mongo($server="mongodb://localhost:8888"); 也可以指定timeout的策略; 
     try {  $mongo = new Mongo($options=array('timeout'=> 100)) } catch(MongoConnectionException $e) {  die("Failed to connect to database ".$e->getMessage()); } 



6  通过PHP保存对象到mongo db中    $connection = new Mongo(); $database   = $connection->selectDB('myblogsite'); $collection = $database->selectCollection('articles'); $article               = array(); $article['title']      = $_POST['title']; $article['content']    = $_POST['content']; $article['saved_at'] = new MongoDate();             $collection->insert($article); 



注意的是,默认不用显式create  database即可,如果不存在则会自动 新建立database,也可以:
$connection = new Mongo(); $collection = $connection->myblogsite->articles; 
// mongodb的插入是异步的,如果不想异步,可以这样; try {  $status = $connection->insert(array('title' => 'Blog Title',  'content' => 'Blog Content'),  array('safe' => True));  echo "Insert operation complete"; } catch (MongoCursorException $e) {  die("Insert failed ".$e->getMessage()); } 
    则必须等插入完成后才返回给用户,继续执行下一条语句      也可以指定timeout的策略:      $collection->insert($document, array('safe' => True, 'timeout'  => True)); 7  设置自己的自增id         $document = array('_id' => hash('sha1', $username.time()),       将设置id为username后加上当前时间再hash. 8  日期设置 
 
 $article['saved_at'] = new MongoDate(); $timestamp = new MongoDate(strtotime('2011-05-21 12:00:00')); print date('g:i a, F j', $timestamp->sec); //prints 12 pm, May 21 

$lastweek = new MongoDate(strtotime('-1 week'));  //找出一个星期以来的记录 $cursor = $articleCollection->find(array('saved_at' => array('$gt' => $lastweek))); 
指定一定范围内的记录: 
 
 $start = new MongoDate(strtotime('2011-05-01 00:00:00')); $end = new MongoDate(strtotime('2011-05-31 23:59:59')); $articleCollection->find(array('saved_at'=> array('$gte' => $start, '$lte' => $end))); 
9  列出某个表的所有记录 
  $cursor = $collection->find();  hasNext()):  $article = $cursor->getNext(); ?> 

找某条记录:$article  = $collection->findOne(array('_id'=> new  MongoId($id))); 查找时也可以传入多个参数: $moviesCollection->find(array('genre'  => 'comedy', 'year' => 2011)); if  ($cursor->count() === 0)  //如果找不到    如果查询多个条件:    $collection->find(array('x' => array('$gt' => 100)));   //$ is escaped within double quotes (")   $collection->find(array('x' => array("\$gt" => 100)));    注意要用单引号,如果要用双引号,则要加上转义符。 10  排序:      $cursor->sort(array('saved_at' => -1)) //按save_at字段降序排列,1为升序 11  skip和limit:       $cursor = $articleCollection->find(); //skip the first five articles in the cursor $cursor->skip(5); $cursor->limit(10);//结果集只取10条 12  更新数据库    $articleCollection->update(array('_id' => new MongoId($id)), $article);    第一个参数为指定的条件(更新条件),第二个参数为要更新的对象 还有可选参数如下;    $collection->update($criteria, $newobj, array('safe' => True));    safe=true时,等到UPDATE结束才返回结果   mongodb还支持upsert的操作:如果存在则更新,如果不存在则插入     $users->update(array('email' => 'alice@wonderland.com'), array('firstname'  => 'Alice', 'lastname'=> 'Liddell'), array('upsert'  => True));      这里对email为alice@wonderland.com的记录进行更新其firstname,lastname字段的内容 13  修饰符      比如set,只修改记录的某个部分,可以这样: $articles->update(array('_id' => MongoId('4dcd2abe5981')), array('$set' => array('title' => 'New Title')));    使用inc: $articles->update(array('_id' => MongoId('4dcd2abe5981')), array('$set' => array('content' => 'New Content'), '$inc' => array('update_count' => 1)) ); // 将update_count+1    unset: $articles->update(array('_id' => MongoId('4dcd2abe5981')), array('$unset' => array('title' => True))); // 将title field从这个document中移除   更名rename: $articles->update(array(), array('$rename' => array('saved_at' => 'created_at')), array('multiple' => True) ); //  将save_at更名为create_at  14  删除记录 $articleCollection->remove(array('_id' => new MongoId($id))); $movies->remove(array('genre' =>'drama'), array('justOne' => True));   如果加了justOne的参数,则只删除符合条件的一条记录而已,其他不删除 15  document的关系 1)嵌套  {   "_id" : ObjectId("4dd491695072aefc456c9aca"),   "username" : "alphareplicant",   "email" : "roybatty@androids.org",   "fullname" : "Roy Batty",   "joined_at" : ISODate("2011-05-19T03:41:29.703Z"), "address" : {     "street" : "13 Tannhauser Gate",     "city" : "Caprica",     "state" : "CC",     "zipcode" : 512 }, }   2)引用 { _id : ObjectId("4dcd2abe5981aec801010000"), title : "The only perfect site is hind-site", content : "Loren ipsum dolor sit amet…", saved_at : ISODate('2011-05-16T18:42:57.949Z'), author_id : ObjectId("4dd491695072aefc456c9aca") } 3)比如一个一对多的关系:   比如一个文章下的评论: $comment = array( 'name' => $_POST['commenter_name'], 'email' => $_POST['commenter_email'], 'comment' => $_POST['comment'], 'posted_at' => new MongoDate() ); $collection->update(array('_id' => new MongoId($id)), array('$push' => array('comments' => $comments)));   使用的是$push的修饰符,一般来说,用内嵌的document效率比较高 或者: $article = $articleCollection->findOne(array('_id' => new MongoId($id))); $comments = (isset($article['comments'])) ? $article['comments'] : array(); $comment = array(                    'name' => $_POST['commenter_name'],                    'email' => $_POST['commenter_email'],                    'comment' => $_POST['comment'],                    'posted_at' => new MongoDate()                );                array_push($comments, $comment); $articleCollection->update(array('_id' => new MongoId($id)), array('$set' => array('comments' => $comments)));   使用.号来查询子嵌套文档 {   name : "Gordon Freeman", address : {    city : "Springfield",    state : "Florida" } } { name : "Lara Croft", address : {    city : "Miami",   state: "Florida" } } // 则查询address中state为florida的document: $users->find(array('address.city' => 'Springfield', 'address.state' => 'Florida')); Generated by Bo-blog 2.0.3 sp1