phpmongo連接
A. mongodb當機後,重啟mongodb,php就連接不上mongodb了,再重啟Apache後,php就可以連接上mongodb,
你的mongo連接方式是什麼?php擴展?還是類文件?如果是php擴展,那就是因為你的apache引入php採用的模塊方式,只有重啟apache才會出發Mshutdown行為。也就是重新載入php擴展,或許你的php擴展里的mongo鏈接是靜態的。
B. 怎麼連接mongo資料庫
執行啟動操作後,mongodb 在輸出一些必要信息後不會輸出任何信息,之後就等待連接的建立,當連接被建立後,就會開始列印日誌信息。 你可以使用 MongoDB shell 來連接 MongoDB 伺服器。你也可以使用 PHP 來連接 MongoDB。本教程我們會使用 MongoDB shell 來連接 Mongodb 服務,之後的章節我們將會介紹如何通過php 來連接MongoDB服務。 標准 URI 連接語法: mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]] mongodb:// 這是固定的格式,必須要指定。 username:password@ 可選項,如果設置,在連接資料庫伺服器之後,驅動都會嘗試登陸這個資料庫 host1 必須的指定至少一個host, host1 是這個URI唯一要填寫的。它指定了要連接伺服器的地址。如果要連接復制集,請指定多個主機地址。 portX 可選的指定埠,如果不填,默認為27017 /database 如果指定username:password@,連接並驗證登陸指定資料庫。若不指定,默認打開 test 資料庫。 ?options 是連接選項。如果不使用/database,則前面需要加上/。所有連接選項都是鍵值對name=value,鍵值對之間通過&或;(分號)隔開
C. thinkphp6 版本 mongodb 連表查詢 案例
# https://www.cnblogs.com/cangqinglang/p/14858131.html
public function index(){
// 方法1 您可以使用 $toObjectId聚合實現此目的,該聚合僅將字元串ID轉換為mongoose objectId
// https://blog.csdn.net/az9996/article/details/110141289
// 多表查詢 https://blog.csdn.net/eric_to/article/details/90093806
$pipeline = [
['$addFields'=>['company_id'=>['$toObjectId'=>'$company_id']]],
['$match'=>['$expr'=>['$eq'=>["\$company_id", "$\$company_Id"]]]],
];
$pipelines = [
// ['$match'=>["_id"=>new \MongoDB\BSON\ObjectId("5cb7e580a6c98abc468b458b")]],
// ['$match'=>["name"=>"xxx限公司"]],
[
'$lookup'=>[
'from'=>'oa_company_member_pay',
"let"=>["company_Id"=>"\$_id" ],
"pipeline"=>$pipeline,
'as'=>'company_pay'
],
]
];
// php 執行 產生了 2571 條數據 但是 用 db.runCommand() 執行 列印的 sql 語句 只有 101 條記錄
mp(Db::connect('mongo')->name('oa_company')->cmd([
'aggregate'=>'oa_company',
'pipeline'=>$pipelines,
'explain'=>false,
]));
mp(Db::connect('mongo')->getLastSql());
// 以下 mongodb sql 在 資料庫 查詢 通過 有 2571 條記錄
// db.getCollection("oa_company").aggregate([
// {
// "$lookup": {
// "from": "oa_company_member_pay",
// "let": { "company_Id": "$_id" },
// "pipeline": [
// { '$addFields': { "company_id": { "$toObjectId": "$company_id" }}},
// { "$match": { "$expr": { "$eq": [ "$company_id", "$$company_Id" ] } } }
// ],
// "as": "company_member_pay"
// }
// }
// ])
// 以下 mongodb sql 在 資料庫 查詢 通過 只有 101 條記錄
// db.runCommand({
// "aggregate":"oa_company",
// "pipeline":[
// {
// "$lookup":{
// "from": "oa_company_member_pay",
// "let": { "company_Id": "$_id" },
// "pipeline": [
// { '$addFields': { "company_id": { "$toObjectId": "$company_id" }}},
// { "$match": { "$expr": { "$eq": [ "$company_id", "$$company_Id" ] } } }
// ],
// "as": "company_member_pay"
// }
// }
// ],
// "explain":false
// })
// 方法2 或者使用$toString聚合 可以通過 2571
// db.getCollection('oa_company').aggregate([
// { "$addFields": { "companyidStr": { "$toString": "$_id" }}},
// { "$lookup": {
// "from": "oa_company_member_pay",
// "localField": "companyidStr",
// "foreignField": "company_id",
// "as": "pay"
// }}
// ])
/*
$pipelines = [
// ['$match'=>["_id"=>new \MongoDB\BSON\ObjectId("5cb7e580a6c98abc468b458b")]],
// ['$match'=>["name"=>"xxx有限公司"]],
['$addFields'=>['companyidStr'=>['$toString'=>'$_id']]],
[
'$lookup'=>[
'from'=>'oa_company_member_pay',
'localField'=>'companyidStr',
'foreignField'=>'company_id',
'as'=>'company_pay'
],
]
];
// php 執行 產生了 2571 條數據 但是 用 db.runCommand() 執行 列印的 sql 語句 只有 101 條記錄
mp(Db::connect('mongo')->name('oa_company')->cmd([
'aggregate'=>'oa_company',
'pipeline'=>$pipelines,
'explain'=>false,
]));
mp(Db::connect('mongo')->getLastSql());
// db.cmd({"aggregate":"oa_company","pipeline":[{"$addFields":{"companyidStr":{"$toString":"$_id"}}},{"$lookup":{"from":"oa_company_member_pay","localField":"companyidStr","foreignField":"company_id","as":"company_pay"}}],"explain":false});
// 下面 執行 不可以 只有 101 條數據
db.runCommand({"aggregate":"oa_company","pipeline":[{"$addFields":{"companyidStr":{"$toString":"$_id"}}},{"$lookup":{"from":"oa_company_member_pay","localField":"companyidStr","foreignField":"company_id","as":"company_pay"}}],"explain":false});
*/
}
D. Mongodb 連接失敗,怎麼避免拋錯影響正常流程
PHP操作MongoDB的 exception handling沒有什麼特別的地方,和其他的場景一樣,使用try catch來處理。
PHP MongDB client包含了一些exeception的類:
MongoDB\Driver\Exception\AuthenticationException
MongoDB\Driver\Exception\BulkWriteException
MongoDB\Driver\Exception\ConnectionException
MongoDB\Driver\Exception\ConnectionTimeoutException
MongoDB\Driver\Exception\Exception
MongoDB\Driver\Exception\ExecutionTimeoutException
MongoDB\Driver\Exception\InvalidArgumentException
MongoDB\Driver\Exception\LogicException
MongoDB\Driver\Exception\RuntimeException
MongoDB\Driver\Exception\SSLConnectionException
MongoDB\Driver\Exception\UnexpectedValueException
MongoDB\Driver\Exception\WriteException
但是您估計為了簡化,只會統一處理MongoDB\Exception\Exception。
正如一樓的朋友所言,可以做一些類來封裝此類操作使得事情簡潔一些。
E. mongodb已經安裝成功,php擴展安裝成功 但是用php 連接失敗 錯誤提示如下
$class='MongoClient';
if(!class_exists($class)){
$class='Mongo';
}
$conn=new$class($hosts,$args);
F. php鏈接mongodb密碼包含@有歧義怎麼解決
public __construct
([ string $server = "mongodb://localhost:27017"
[, array $options = array("connect" => TRUE)
]] )
看MongoClient
構造方法,我感覺,你可以把一些
$this->conn = new MongoClient("mongodb://{$host}:{$port}
",array('username'=>$username,'password'=>$passwd,'db'=>$db));
G. mongo php 操作 怎樣更新一條數據
PHP操作MongoDB資料庫的簡單示例。
Mongodb的常用操作
參看手冊,php官方的http://us2.php.net/manual/en/mongo.manual.php
也可以參看mongodb官方的教程。
一,Mognodb資料庫連接
1)、默認格式
復制代碼代碼示例:
$m=newMongo();
//這里採用默認連接本機的27017埠,當然也可以連接遠程主機如192.168.0.4:27017,如果埠是27017,埠可以省略。
2)、標准連接
$m=newMongo(「mongodb://${username}:${password}@localhost」);
實例:
復制代碼代碼示例:
$m=newMongo(「mongodb://127.0.0.1:27017/admin:admin」);
資料庫的用戶名和密碼都是admin
資料庫操作:
1)、插入數據:
復制代碼代碼示例:
<?php
//這里採用默認連接本機的27017埠,當然你也可以連接遠程主機如192.168.0.4:27017
//如果埠是27017,埠可以省略
$m=newMongo("mongodb://127.0.0.1:27017/admin:admin");
//選擇comedy資料庫,如果以前沒該資料庫會自動創建,也可以用$m->selectDB("comedy");
$db=$m->comedy;
//選擇comedy裡面的collection集合,相當於RDBMS裡面的表,也可以使用
$collection=$db->collection;
$db->selectCollection("collection");
/*********添加一個元素**************/
$obj=array("title"=>"php1","author"=>"BillWatterson");
//將$obj添加到$collection集合中
$collection->insert($obj);
/*********添加另一個元素**************/
$obj=array("title"=>"huaibei","online"=>true);
$collection->insert($obj);
//$query=array("title"=>"huaibei");
$query=array("_id"=>$obj['_id']);
$cursor=$collection->find($query);
//遍歷所有集合中的文檔
foreach($cursoras$obj){
echo$obj["title"]." ";
echo$obj["_id"]." ";
}
//斷開MongoDB連接
$m->close();
2)、帶條件的查詢
查詢title為huaibei的欄位
1$query=array(」title」=>」huaibei」);
2$cursor=$collection->find($query);//在$collectio集合中查找滿足$query的文檔
常用的SQL轉化為mongodb的條件
復制代碼代碼示例:
mysql:id=123
mongo:array(『id』=>123)
mysql:namelink』%bar%』
mongo:array(『name』=>newMongoRegex(『/.*bar.*/i』))
mysql:whereid>10
mongo:array(『id』=>array(『$gt』=>10))
mysql:whereid>=10
mongo:array(『id』=>array(『$gte』=>10))
mysql:whereid<10
mongo:array(『id』=>array(『$lt』=>10))
mysql:whereid<=10
mongo:array(『id』=>array(『$lte』=>10))
mysql:whereid>1andid<10
mongo:array(『id』=>array(『$gt』=>1,』$lt』=>10))
mysql:whereid<>10
mongo:array(『id』=>array(『$ne』=>10))
mysql:whereidin(123)
mongo:array(『id』=>array(『$in』=>array(1,2,3)))
mysql:whereidnotin(123)
mongo:array(『id』=>array(『$nin』=>array(1,2,3)))
mysql:whereid=2orid=9
mongo:array(『id』=>array(『$or』=>array(array(『id』=>2),array(『id』=>9))))
mysql:orderbynameasc
mongo:array(『sort』=>array(『name』=>1))
mysql:orderbynamedesc
mongo:array(『sort』=>array(『name』=>-1))
mysql:limit0,2
mongo:array(『limit』=>array(『offset』=>0,』rows』=>2))
mysql:selectname,email
mongo:array(『name』,'email』)
mysql:selectcount(name)
mongo:array(『COUNT』)//注意:COUNT為大寫
更詳細的轉換參考http://us2.php.net/manual/en/mongo.sqltomongo.php
注意事項:
查詢時,每個Object插入時都會自動生成一個獨特的_id,它相當於RDBMS中的主鍵,用於查詢時非常方便(_id每一都不同,很像自動增加的id)
例如:
復制代碼代碼示例:
<?php
$param=array("name"=>"joe");
$collection->insert($param);
$joe=$collection->findOne(array("_id"=>$param['_id']));
print_R($joe);
$m->close();
返回結果:Array([_id]=>MongoIdObject([$id]=>4fd30e21870da83416000002)[name]=>joe)
更改欄位值:
復制代碼代碼示例:
<?php
$sign=array("title"=>'php1');
$param=array("title"=>'php1','author'=>'test');
$joe=$collection->update($sign,$param);
刪除一個資料庫:
復制代碼代碼示例:
$m->dropDB(「comedy」);
列出所有可用資料庫:
復制代碼代碼示例:
$m->listDBs();//無返回值
附,mongodb常用的資料庫方法
MongoDB中有用的函數:
創建一個MongoDB對象
復制代碼代碼示例:
<?php
$mo=newMongo();
$db=newMongoDB($mo,』dbname』);//通過創建方式獲得一個MongoDB對象
刪除當前DB
復制代碼代碼示例:
<?php
$db=$mo->dbname;
$db->drop();
獲得當前資料庫名
復制代碼代碼示例:
<?php
$db=$mo->dbname;
$db->_tostring();
選擇想要的collection:
復制代碼代碼示例:
A:
$mo=newMongo();
$coll=$mo->dbname->collname;//獲得一個collection對象
B:
$db=$mo->selectDB(』dbname』);
$coll=$db->collname;
C:
$db=$mo->dbname;
$coll=$db->collname;
D:
$db=$mo->dbname;
$coll=$db->selectCollectoin(』collname』);//獲得一個collection對象
插入數據(MongoCollection對象):
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型的數組,包含操作信息
刪除資料庫中的記錄(MongoCollection對象):
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型的數組,包含操作信息
更新資料庫中的記錄(MongoCollection對象):
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->remove($c,$newobj,$options);
$rs為一個array型的數組,包含操作信息
查詢collection獲得單條記錄(MongoCollection類):
http://us.php.net/manual/en/mongocollection.findone.php
arrayMongoCollection::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
MongoCursorMongoCollection::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);
//排序
$cursor->sort(array(『欄位』=>-1));(-1倒序,1正序)
//跳過部分記錄
$cursor->skip(100);跳過100行
//只顯示部分記錄
$cursor->limit(100);只顯示100行
返回一個游標記錄對象MongoCursor。
針對游標對象MongoCursor的操作(MongoCursor類):
http://us.php.net/manual/en/class.mongocursor.php
循環或結果記錄:
復制代碼代碼示例:
$cursor=$coll->find($query,$fields);
while($cursor->hasNext()){
$r=$cursor->getNext();
var_mp($r);
}
或者
$cursor=$coll->find($query,$fields);
foreache($cursoras$k=>$v){
var_mp($v);
}
或者
$cursor=$coll->find($query,$fields);
$array=iterator_to_array($cursor);
H. php7.3.4連接MongoDB2.2.2用哪個版本的擴展呢
首先進入pecl(PHP Extension Community Library)網站;
搜索mongodb擴展;
點擊版本,查看支持的php版本
I. php mongoclient 連接 mongodb ,出現 "No candidate servers found"錯誤。實在沒辦法,求大神們解答。
表標PHP已經自帶了mongo功能,你就可以操作下面的代碼(但是你必須有安裝mongodb伺服器)一、連接資料庫使用下面的代碼創建一個資料庫鏈接復制代碼代碼如下:listDBs());//能列印出資料庫數組,看看有幾個資料庫。?>如圖:上圖說有一個資料庫名字叫local,總大小1個位元組,他是空的。看見ok表示運行成功。現在你可以使用$connection鏈接來操作資料庫了選擇資料庫使用下面的代碼來選擇一個資料庫復制代碼代碼如下:dbname;?>這里的資料庫並不一定是一個已經存在的資料庫,如果所選擇的資料庫不存在,則會新建一個資料庫,所以在選擇資料庫的時候,注意一定要填上正確的資料庫名如果拼寫錯誤的話,很有可能會新建一個資料庫復制代碼代碼如下:mybiglongdbname;//做一些事情$db=$connection->mybiglongdbnme;//現在會連上一個新的資料庫?>獲取一個集合獲取一個集合跟選擇資料庫擁有相同的語法格式復制代碼代碼如下:baz;//選擇資料庫$collection=$db->foobar;//選擇foobar集合//或者使用更簡潔的方式$collection=$connection->baz->foobar;?>插入一個文檔多維數組是可以被儲存到資料庫中的基本單元一個隨機的文檔可能是這樣復制代碼代碼如下:「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()插入一個文檔復制代碼代碼如下: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()操作以得到集合中的第一個文檔數據,這種方法只返回一個文檔數據,這種方法適用於在你的查詢語句的時候只匹配一個文檔或者你只關心第一條數據復制代碼代碼如下: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儲存元素中以_以及$開頭的都是供內部使用的添加文檔為了做一些更有趣的事情,我們添加簡單的文檔到集合中,這些文檔如下復制代碼代碼如下:value);?>我們可以使用循環相當有效的插入數據復制代碼代碼如下:insert(array(「i」=>$i));}?>注意:我們可以插入不同的欄位在同一字元集中,在這方面意味著MongoDB擁有非常自由的儲存模式在一個集合中計算文檔的數量現在我們插入了101個文檔(我們用循環插入了100個,之前還插入了一個),我們可以使用count()來看看我們的數據是不是都被插入進去了復制代碼代碼如下:count();?>這段代碼將列印出101MongoCollection::count()也可以查詢欄位數據使用游標得到集合中的所有文檔為了得到集合中的所有文檔,我們可以使用MongoCollection::find()方法,find()方法返回一個MongoCursor對象,可以讓我們重復得到查詢所匹配的的文檔復制代碼代碼如下:find();foreach($cursoras$id=>$value){echo「$id:「;var_mp($value);}?>這樣我們會列印出集合中的這101個文檔,$id就是文檔中的_id欄位,$value就是文檔本身為查詢規定一個標准我們可以通過find()方法得到集合中的文檔子集,例如,我們要查詢出集合中i欄位為71的文檔,我們可以使用下列方法復制代碼代碼如下: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的文檔,我們可以使用如下代碼復制代碼代碼如下:array(『$gt'=>50));//注意'$gt'兩邊的單引號$cursor=$coll->find($query);while($cursor->hasNext()){var_mp($cursor->getNext());}?>我們同樣可以得到20array(「\$gt」=>20,「\$lte」=>30));$cursor=$coll->find($query);while($cursor->hasNext()){var_mp($cursor->getNext());}?>我們非常容易漏掉$美元符號,你也可以選擇你自定義的符號來代替美元符號,選擇一個不會在你的建裡面出現的符號例如」:」,在php.ini中加上這么一句話復制代碼代碼如下:mongo.cmd=「:」那麼上面的代碼就可以替換成復制代碼代碼如下:array(「:gt」=>20,「:lte」=>30));?>當然你也可以使用ini_set(「mongo.cmd」,「:」)的方法來改變創建一個索引MongoDB支持索引,並且可以很容易的加到一個集合中,你只要指定某個欄位為索引就行了,並且還可以指定正序索引(1)與倒序索引(-1)下面的代碼為I創建了索引復制代碼代碼如下:ensureIndex(array(「i」=>1));//在」i」上創建了一個索引$coll->ensureIndex(array(「i」=>-1,「j」=>1));//在」i」上創建了倒序索引在」j」上創建了正序索引?>一個完整的簡單例子這個例子展示了如何鏈接mongodb資料庫,如何選擇資料庫,如何插入數據,如何查詢數據,以及關閉資料庫鏈接復制代碼代碼如下:comedy;$collection=$db->cartoons;//添加一個元素$obj=array("title"=>"CalvinandHobbes","author"=>"BillWatterson");$collection->insert($obj);//修改$newdata=array('$set'=>array("title"=>"CalvinandHobbes"));$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($cursoras$obj){echo$obj["title"]."\n";}//關閉鏈接$m->close();?>輸出結果為復制代碼代碼如下:CalvinandHobbesXKCD