❶ mongodb已經安裝成功,php擴展安裝成功 但是用php 連接失敗 錯誤提示如下
$class='MongoClient';
if(!class_exists($class)){
$class='Mongo';
}
$conn=new$class($hosts,$args);
❷ 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_mp( $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; $i<100; $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_mp( $value );
}
?>
這樣我們會列印出集合中的這101個文檔,$id就是文檔中的_id欄位,$value 就是文檔本身
為查詢規定一個標准
我們可以通過find()方法得到集合中的文檔子集,例如,我們要查詢出集合中i欄位為71的文檔,我們可以使用下列方法
復制代碼 代碼如下:
<?php
$query = array( 「i」 => 71 );
$cursor = $collection->find( $query );
while( $cursor->hasNext() ) {
var_mp( $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_mp( $cursor->getNext() );
}
?>
我們同樣可以得到20 < i <= 30之間的數據
復制代碼 代碼如下:
<?php
$query = array( 「i」 => array( 「\$gt」 => 20, 「\$lte」 => 30 ) );
$cursor = $coll->find( $query );
while( $cursor->hasNext() ) {
var_mp( $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
❸ 如何為PHP安裝mongodb的擴展
1.首先下載php的mongodb擴展
從http://pecl.php.net/package/mongo這個網址下載mongodb的擴展源碼包
1
wget http://pecl.php.net/get/mongo-1.4.5.tgz
2.解壓安裝包
1
tar zxf mongo-1.4.5.tgz
3.進入解壓目錄,運行phpize進行安裝准備
1
2
cd mongo-1.4.5
/usr/local/php/bin/phpize
4.安裝編譯
上述命令運行完後,在目錄下就生成了configure文件
使用./configure命令進行安裝配置,然後使用make && make install進行編譯安裝,命令如下:
1
2
./configure --with-php-config=/usr/local/php/bin/php-config
make && make install
5.編輯php.ini增加下述一行添加mongodb擴展
1
extension=mongo.so
重啟web容器,然後查看phpinfo,看到mongodb的內容就說明安裝成功。
❹ mongodb 樂觀鎖怎麼使用php
sql中並發控制採用的樂觀鎖就是在記錄中增加版本號或timestamp,那麼MongoDB中如何實現呢?
Mongodb不善於處理事務,但提供了findAndModify命令。該命令允許對文檔進行原子性更新,並在同一次調用中返回:
代碼如如:
db.collection_yown.findAndModify(
{
query:{"name":"yown"},update:{"version":2},new:true or false
}
)
默認情況下,findAndModify命令會返回更新前的文檔,要是返回修改後的文檔,就把new設置為false.
Mongodb同時也提供update命令,這兩者的區別如下:
update和findAndModify都可以用做更新操作;
區別
findAndModify是有返回值的,輸出中的value欄位即返回修改之前的文檔,使用 new:true選項返回修改後的文檔。 update是更新操作,是沒有返回值的。
findAndModify 強調操作的原子性(atomically),比如用來實現自增1的操作或者操作隊列。屬於 get-and-set 式的操作,一般來講,findAndModify 比update操作稍慢,因為需要等待資料庫的響應。
另外findAndModify ,其中modify可以是update,還可以是remove
{
findAndModify: <string>,
query: <document>,
sort: <document>,
remove: <boolean>,
update: <document>,
new: <boolean>,
fields: <document>,
upsert: <boolean>
}
❺ PHP連接mongodb資料庫,登陸後想顯示登錄人的用戶名,為什麼現在顯示1
方法如下:
創建資料庫
use tt
這樣就創建了一個資料庫,如果什麼都不操作離開的話,這個庫就會被系統刪除.所以還要執行下面的命令:
db.usr.insert({'name':'tompig'});
db.usr.insert({'name':'tompig1','id':1});
隨便整了2個表,這個無所謂的,反正要導入表的話就刪除掉這2個就可以了,目前只是想讓資料庫保持住.
然後使用命令查看是否有保存tt這個資料庫:
show dbs
3.配置用戶
use tt
db.addUser('mongodb','123456');
mongodb是用戶名,123456是密碼.
好了,這樣一個資料庫和對這個資料庫配置用戶就完成了.
mongodb常用命令:
1、Help查看命令提示
help
db.help();
db.yourColl.help();
db.youColl.find().help();
rs.help();
2、切換/創建資料庫
use yourDB; 當創建一個集合(table)的時候會自動創建當前資料庫
3、查詢所有資料庫
show dbs;
4、刪除當前使用資料庫
db.dropDatabase();
5、從指定主機上克隆資料庫
db.cloneDatabase(「127.0.0.1」); 將指定機器上的資料庫的數據克隆到當前資料庫
6、從指定的機器上復制指定資料庫數據到某個資料庫
db.Database("mydb", "temp", "127.0.0.1");將本機的mydb的數據復制到temp資料庫中
7、修復當前資料庫
db.repairDatabase();
8、查看當前使用的資料庫
db.getName();
db; db和getName方法是一樣的效果,都可以查詢當前使用的資料庫
9、顯示當前db狀態
db.stats();
10、當前db版本
db.version();
11、查看當前db的鏈接機器地址
db.getMongo();
Collection聚集集合
1、創建一個聚集集合(table)
db.createCollection(「collName」, {size: 20, capped: 5, max: 100});
2、得到指定名稱的聚集集合(table)
db.getCollection("account");
3、得到當前db的所有聚集集合
db.getCollectionNames();
4、顯示當前db所有聚集索引的狀態
db.printCollectionStats();
用戶相關
1、添加一個用戶
db.addUser("name");
db.addUser("userName", "pwd123", true); 添加用戶、設置密碼、是否只讀
2、資料庫認證、安全模式
db.auth("userName", "123123");
3、顯示當前所有用戶
show users;
4、刪除用戶
db.removeUser("userName");
其他
1、查詢之前的錯誤信息
db.getPrevError();
2、清除錯誤記錄
db.resetError();
❻ php 遠程連接Mongodb問題
<?php //這里採用默認連接本機的27017埠,當然你也可以連接遠程主機如192.168.0.4:27017,如果埠是27017,埠可以省略 $m = new Mongo(); // 選擇comedy資料庫,如果以前沒該資料庫會自動創建,也可以用$m->selectDB("comedy"); $db = $m->comedy; //選擇comedy裡面的collection集合,相當於RDBMS裡面的表,也-可以使用 $collection = $db->collection; $db->selectCollection("collection"); //添加一個元素 $obj = array( "title" => "Calvin and Hobbes-".date('i:s'), "author" => "Bill Watterson" ); //將$obj 添加到$collection 集合中 $collection->insert($obj); //添加另一個元素 $obj = array( "title" => "XKCD-".date('i:s'), "online" => true ); $collection->insert($obj); //查詢所有的記錄 $cursor = $collection->find(); //遍歷所有集合中的文檔 foreach ($cursor as $obj) { echo $obj["title"] . "<br />\n"; } //刪除所有數據 //$collection->remove(); //刪除 name 為hm //$collection->remove(array('name'=>'hm')); //斷開MongoDB連接 $m->close(); ?>
你可以去後盾人平台看看,裡面的東西不錯
❼ mongodb 的連接php會自動釋放嗎
mongodb 的連接php會自動釋放,這就是MongoDB 的特點。如果不希望這樣,可以使用持久連接。連接池之類的。或者限制連接數。
❽ 為什麼我用php查詢mongodb資料庫中的某個集合中的文檔的條數,得到的結果和實際情況不一致
我也遇到過:
官方文檔解釋了這種現象的原因以及解決方法:
不準確的原因:
操作的是分片的集合(前提);
shard分片正在做塊遷移,導致有重復數據出現
存在孤立文檔(因為不正常關機、塊遷移失敗等原因導致)
解決方法
使用聚合aggregate的方式查詢count數量,shell命令如下:
db.collection.aggregate(
[
{ $group: { _id: null, count: { $sum: 1 } } }
])
也可以直接將原數據導出,將表刪除後重新導入就可以了(我是這么處理的)
❾ php7 mongodb 擴展 真的很差嗎
MongoDB\Driver\Manager::executeBulkWrite
這玩意還配置了一個巨大的類庫來配合調用:就是這個:https://github.com/mongodb/mongo-php-library ,純粹是脫褲子放P,多此一舉,本來原生擴展就已經巨長、巨難用,還配一個根本沒有簡化任何代碼的庫有什麼意義?甚至於調用這個類庫比原生的名字更長、更啰嗦,而且多了一層封裝就多一次bug機會。
這個庫文件總共63個,看看,如果你隨便寫個腳本訪問一下mongodb,還得包含63個文件,我TM整個項目都沒有63個文件好不好?這些個寫慣了java的沒事就老老實實寫java,都跑來寫php,php是要解析執行的,又不像jvm那麼編譯優化執行,搞那麼多文件,不影響執行速度嗎?真是狗屎,所以完全不推薦用這個狗屎庫。
但是這個擴展最奇怪的就是文檔超級簡陋,根本不能獲得任何有價值的信息,所以只能靠摸索來了。
下面是我用到的由MongoClient遷移到MongoDB\Driver的差異點。
MongoClient插入或更新是同樣的代碼:
(new MongoClient())->{$db}->{$collection}->save($arr);
// 這個$arr數組可以直接含有 "_id" 索引來指定 mongodb文檔的_id值,就這么簡單粗暴,這才是php啊!
MongoDB\Driver,插入和更新需要區分:
$mongo = new MongoDB\Driver\Manager();
$bulk = new MongoDB\Driver\BulkWrite(['ordered' => true]);
$data = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query([]), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED))->toArray();
if (empty($data[0])) { // 確定不存在,插入
$bulk->insert($arr);
} else { // 否者更新
$bulk->update([], array('$set' => $arr)); // $arr同樣是剛才的數組
}
// 還沒完,還要執行下一步:db.collection要替換成實際的資料庫、集合名
$result = $mongo->executeBulkWrite('db.collection', $bulk, new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000));
// 返回插入或更新是否成功:
$ok = $result->getInsertedCount() || $result->getModifiedCount() ? 1 : 0;
// 真是夠了!
查詢一條記錄:
MongoClient:
(new MongoClient())->{$db}->{$collection}->findOne(['_id' => $id]);
MongoDB\Driver:
$mongo = new MongoDB\Driver\Manager();
$result = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query(['_id'=>$id], []), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED));
// 返回的$result是一個對象,需要手動轉換成數組。
查詢數量時候,需要注意:
$mongo = new MongoDB\Driver\Manager();
$cursor = $mongo-executeCommand($db, new MongoDB\Driver\Command($arr), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_SECONDARY_PREFERRED));
// 這里$cursor是一個游標。需要注意$arr里的欄位:
$arr = ['count'=>$collection, 'query'=>$query]; // 這里count必須排在前面,位置反了直接報異常。
查詢結果集:
$mongo = new MongoDB\Driver\Manager();
$cursor = $mongo->executeQuery('db.collection', new MongoDB\Driver\Query($arr, $opts), new MongoDB\Driver\ReadPreference(MongoDB\Driver\ReadPreference::RP_PRIMARY_PREFERRED));
//注意,這里的 $arr和 $opts;
$arr = ['_id'=> ['$in'=> $ids] ]; // 根據id數組獲取集合
$opts = ['limit'=> $limit, 'skip'=> $skip ]; // 不推薦
// 這里在傳遞$limit和$skip的時候,最好先轉成整數,不然不生效:
$opts = ['limit'=> (int) $limit, 'skip'=> (int) $skip ]; // 推薦寫法。
// 寫到這里,讓人懷疑是不是在用php了,怎麼還需要這樣的類型轉換。字元串整數都不行!
基本就這樣,推薦自己封裝一個簡單的MongoDB\Driver,而不是使用那個巨大無比的庫、也不推薦直接用原生