上文地址:http://www.reibang.com/p/1de642b956f7
接下來,我就按照mongo-php-library
這個官方包來給大家演示一遍基本的curd,我附帶上原生的mongodb語句,以便大家理解
注明:我用的MongoDB版本為3.4.
打開任意一張表就可以看到這樣的界面,在紅框內(nèi)輸入原生語句,
ctrl+r
執(zhí)行
首先,安裝這個包composer require mongodb/mongodb
,再加上use MongoDB;
,然后就可以開始享用了.
該庫的手冊地址:https://docs.mongodb.com/php-library/current/tutorial/crud/
連接
//連接本地服務(wù)
$client = new MongoDB\Client('mongodb://127.0.0.1:27017');
//選擇數(shù)據(jù)庫和集合
$collection = $client->selectCollection('DatebaseName', 'collectionName');
//這個庫同時支持mongo拓展的寫法.
//$collection = $client->DatebaseName->collectionName;
插入
單條插入 : insertOne
方法將單個文檔插入到MongoDB中迅办,并返回一個實例,使用getInsertedId
可以獲取插入文檔的id , mongodb會自動生_id
字段,為24位隨機字符串,同時,用戶也可以指定生成
原生語句為db.user.insertOne({'name':'dullcat'})
$user = array('name'=>'Dullcat','sex'=>'male');
//執(zhí)行并返回實例
$result = $collection->insertOne($user);
//拿到返回的_id
$id= $result->getInsertedId();
//返回值:5af53f89804c044a340018f2
批量插入:跟mysql的批量原理相同,組裝成多維數(shù)組.和單條插入的函數(shù)相仿insertMany
,getInsertedIds
原生語句為db.user.insertMany([{'name':'貓爺'},{'name':'Dullcat'}])
$users = array(array('name'=>'貓爺','sex'=>'male'),array('name'=>'DullCat','sex'=>'male'));
$result = $collection->insertMany($users);
$ids_info= $result->getInsertedIds();
//拿到插入的個數(shù)
$count = $result->getInsertedCount();
/**
//返回值:
array(2) {
[0]=>
object(MongoDB\BSON\ObjectId)#11 (1) {
["oid"]=>
string(24) "5af548d3804c044a340018f8"
}
[1]=>
object(MongoDB\BSON\ObjectId)#14 (1) {
["oid"]=>
string(24) "5af548d3804c044a340018f9"
}
}
*/
需要注意的是批量返回的并不是string類型的id了,而是一個非常復(fù)雜的結(jié)構(gòu),如果我們想要以數(shù)組形式拿到他的_id,我們可以使用一下函數(shù)
foreach($ids_info as $value){
$ids [] = $value->__toString();
}
/**
//格式為:
array(2) {
[0]=>
string(24) "5af54ead804c044a34001920"
[1]=>
string(24) "5af54ead804c044a34001921"
}
*/
查詢
單個查詢:findOne
,相當(dāng)于sql語句的limit 1
原生語句:db.user.findOne({"_id":ObjectId("5af5553f804c044a34001922")})
//由于儲存的`_id`字段是一個BSON類型的object,所以要按_id字段來查的話,要先進行類型轉(zhuǎn)換
$mongo_id = new MongoDB\BSON\ObjectId('5af5553f804c044a34001922');
//查詢執(zhí)行
$info = $collection->findOne(array('_id'=>$mongo_id));
//如果沒有找到,返回值為null
//返回值是一個對象,這里我們可以將他強制類型轉(zhuǎn)換`$info = (array)$info`
/**
object(MongoDB\Model\BSONDocument)#22 (1) {
["storage":"ArrayObject":private]=>
array(4) {
["_id"]=>
object(MongoDB\BSON\ObjectId)#21 (1) {
["oid"]=>
string(24) "5af5553f804c044a34001922"
}
["name"]=>
string(5) "suhua"
["age"]=>
int(26)
["sex"]=>
string(3) "男"
}
}
*/
多個查詢:find
多個查詢有兩個數(shù)組參數(shù),第一個是查詢的條件,第二個是選項
$info = $collection->find(array('name'=>'DullCat'));
//第一個數(shù)組的查詢條件要注意下`$gt`這是查詢選擇器,表示大于
//第二個數(shù)組的選項意義為:`skip`跳過0條數(shù)據(jù),`limit`查詢10條數(shù)據(jù),`sort`按age字段正序排序(1為正序,-1為倒序)
$info = $collection->find(array('name'=>'Dullcat',,'age'=>array('$gt'=>'1')),array('skip'=>0,'limit'=>10,'sort'=>array('age'=>1)));
//這時請注意,多個查詢返回的是游標(biāo)(Cursor),需要的進行處理
//您可以用函數(shù)轉(zhuǎn)換
$info_array = $info->toArray();
//也可以用foreach迭代該對象
foreach($info as $value){
$info_array [] = $value;
}
更新
單條更新updateOne
多條更新updateMany
單個更新和多個更新的用法一模一樣,但是要注意的是他的操作符和選項
//update方法有三個數(shù)組參數(shù)
//第一個數(shù)組是查詢條件
//第二數(shù)組是更新操作符,例如下面的`array('$set'=>array('age'=>'23'))`,意義為:更改age字段為23
//第三個數(shù)組是選項,可以選擇各種參數(shù),例如下面的`array('upsert'=>true)`,意義為當(dāng)能查詢到就進行更改,如果沒有查詢到就進行新增操作
$result = $collection->updateOne(array('name'=>'DullCat'),array('$set'=>array('age'=>'23')),array('upsert'=>true));
/**
原生語句
db.user.updateOne(
{ "name": "dullcat" },
{$set: { "age": "123" }},
{ upsert: true }
)
*/
刪除
單個刪除deleteOne
原生語句:db.users.deleteOne( { name: "DullCat" } )
多個刪除deleteMany
原生語句:db.users.deleteMany( { name: "DullCat" } )
單個刪除和多個刪除的用法一模一樣,只是單個刪除只刪除查詢到的第一條數(shù)據(jù),而多個刪除則刪除匹配到的所有數(shù)據(jù)
//單個刪除
$result = $collection->deleteOne(array('name'=>'DullCat'));
//多個刪除
$result = $collection->deleteMany(array('name'=>'DullCat'));
//拿到刪除數(shù)據(jù)的條數(shù)
$count = $result->getDeletedCount();
當(dāng)然,還有很多功能我都沒講到,比如常用的aggregate
聚合,這些就留給大家去閱讀官方文檔吧
參考文檔:
查詢選擇器:https://docs.mongodb.com/manual/reference/operator/query/
更新操作符:https://docs.mongodb.com/manual/reference/operator/update/#update-operators
Aggregation Pipeline:https://docs.mongodb.com/manual/reference/operator/aggregation-pipeline/