MongoDB PHP 教程
在本教程中,我们将展示如何在 PHP 中使用 MongoDB。 我们将新的mongodb
驱动程序用于 PHP。 在 ZetCode 上有一个简洁的 PHP 教程。
MongoDB 是 NoSQL 跨平台的面向文档的数据库。 它是可用的最受欢迎的数据库之一。 MongoDB 由 MongoDB Inc. 开发,并作为免费和开源软件发布。
MongoDB 中的记录是一个文档,它是由字段和值对组成的数据结构。 MongoDB 文档与 JSON 对象相似。 字段的值可以包括其他文档,数组和文档数组。 MongoDB 将文档存储在集合中。 集合类似于关系数据库中的表,文档类似于行。
安装 MongoDB
以下命令可用于在基于 Debian 的 Linux 上安装 MongoDB。
$ sudo apt-get install mongodb
该命令将安装 MongoDB 随附的必要包。
$ sudo service mongodb status
mongodb start/running, process 975
使用sudo service mongodb status
命令,我们检查mongodb
服务器的状态。
$ sudo service mongodb start
mongodb start/running, process 6448
mongodb
服务器由sudo service mongodb start
命令启动。
建立数据库
mongo
工具是 MongoDB 的交互式 JavaScript Shell 界面,它为系统管理员提供了一个界面,并为开发者提供了一种直接测试数据库查询和操作的方法。
$ mongo testdb
MongoDB shell version: 2.4.9
connecting to: testdb
> db
testdb
> db.cars.insert({name: "Audi", price: 52642})
> db.cars.insert({name: "Mercedes", price: 57127})
> db.cars.insert({name: "Skoda", price: 9000})
> db.cars.insert({name: "Volvo", price: 29000})
> db.cars.insert({name: "Bentley", price: 350000})
> db.cars.insert({name: "Citroen", price: 21000})
> db.cars.insert({name: "Hummer", price: 41400})
> db.cars.insert({name: "Volkswagen", price: 21600})
我们创建一个testdb
数据库,并在cars
集合中插入八个文档。
安装 PHP 驱动程序
有两种驱动程序可用:旧版mongo
驱动程序和新版mongodb
驱动程序。 在本教程中,我们将使用新的mongodb
驱动程序。
接下来,我们展示如何手动安装 PHP MongoDB 驱动程序。
$ git clone https://github.com/mongodb/mongo-php-driver.git
$ cd mongo-php-driver
$ git submodule sync && git submodule update --init
$ phpize
$ ./configure
$ make
$ sudo make install
我们下载源代码并从中安装驱动程序。
extension=mongodb.so
我们将mongodb.so
扩展名添加到php.ini
文档中。
数据库统计
第一个示例连接到testdb
数据库并获取其统计信息。
MongoDB\Driver\Manager
负责维护与 MongoDB 的连接。 MongoDB\Driver\Command
表示数据库命令。 成功后,命令返回MongoDB\Driver\Cursor
。
dbstats.php
<?php
try {
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$stats = new MongoDB\Driver\Command(["dbstats" => 1]);
$res = $mng->executeCommand("testdb", $stats);
$stats = current($res->toArray());
print_r($stats);
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
该示例连接到testdb
数据库并执行dbstats
命令。 它显示了一些数据库统计信息。
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
使用MongoDB\Driver\Manager
类,我们连接到testdb
数据库。 27017 是 MongoDB 服务器监听的默认端口。
$res = $mng->executeCommand("testdb", $stats);
MongoDB\Driver\Command
用于执行dbstats
命令。
$stats = current($res->toArray());
toArray()
方法返回一个数组,其中包含此游标的所有结果,current()
函数返回该数组的当前元素。 在我们的例子中,数组只有一个元素。
print_r($stats);
print_r()
函数打印$stats
变量的人类可读表示。
$ php dbstats.php
stdClass Object
(
[db] => testdb
[collections] => 3
[objects] => 12
[avgObjSize] => 52.666666666667
[dataSize] => 632
[storageSize] => 12288
[numExtents] => 3
[indexes] => 1
[indexSize] => 8176
[fileSize] => 201326592
[nsSizeMB] => 16
[dataFileVersion] => stdClass Object
(
[major] => 4
[minor] => 5
)
[ok] => 1
)
这是dbstats.php
程序的输出。
列出数据库
listDatabases
命令提供所有现有数据库的列表。
list_databases.php
<?php
try {
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$listdatabases = new MongoDB\Driver\Command(["listDatabases" => 1]);
$res = $mng->executeCommand("admin", $listdatabases);
$databases = current($res->toArray());
foreach ($databases->databases as $el) {
echo $el->name . "\n";
}
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
该示例在 MongoDB 中打印可用的数据库。
$listdatabases = new MongoDB\Driver\Command(["listDatabases" => 1]);
$res = $mng->executeCommand("admin", $listdatabases);
我们执行listDatabases
命令。 该命令在admin
数据库上执行。
$databases = current($res->toArray());
该命令返回单个结果文档,其中包含databases
数组字段中所有数据库的信息。
foreach ($databases->databases as $el) {
echo $el->name . "\n";
}
我们遍历数据库数组并打印可用数据库的名称。
$ php list_databases.php
testdb
test
local
在本地计算机上,我们具有这三个数据库。
读取数据
MongoDB\Driver\Query
是代表数据库查询的值对象。
read_all.php
<?php
try {
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query([]);
$rows = $mng->executeQuery("testdb.cars", $query);
foreach ($rows as $row) {
echo "$row->name : $row->price\n";
}
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
该示例从testdb.cars
集合读取所有数据。
$query = new MongoDB\Driver\Query([]);
创建一个MongoDB\Driver\Query
对象。 如果我们传递一个空数组,它将读取所有数据。
$rows = $mng->executeQuery("testdb.cars", $query);
executeQuery()
执行查询。 第一个参数是集合名称,第二个参数是查询。
foreach ($rows as $row) {
echo "$row->name : $row->price\n";
}
我们遍历所有匹配的文档。
$ php read_all.php
Audi : 52642
Mercedes : 57127
Skoda : 9000
Volvo : 29000
Bentley : 350000
Citroen : 21000
Hummer : 41400
Volkswagen : 21600
这是read_all.php
脚本的输出。
过滤数据
MongoDB\Driver\Query
包含用于过滤数据的过滤参数。
filtering.php
<?php
try {
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$filter = [ 'name' => 'Volkswagen' ];
$query = new MongoDB\Driver\Query($filter);
$res = $mng->executeQuery("testdb.cars", $query);
$car = current($res->toArray());
if (!empty($car)) {
echo $car->name, ": ", $car->price, PHP_EOL;
} else {
echo "No match found\n";
}
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
该示例搜索大众汽车的价格。
$filter = [ 'name' => 'Volkswagen' ];
$query = new MongoDB\Driver\Query($filter);
我们将过滤器参数提供给MongoDB\Driver\Query
。
$car = current($res->toArray());
if (!empty($car)) {
echo $car->name, ": ", $car->price, PHP_EOL;
} else {
echo "No match found\n";
}
我们会打印所选汽车的名称和价格。 我们使用empty()
函数确保返回的变量不为空。
$ php filtering.php
Volkswagen: 21600
这是filtering.php
脚本的输出。
投影
投影可用于指定应返回哪些字段。
projection.php
<?php
try {
$filter = [];
$options = ["projection" => ['_id' => 0]];
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query($filter, $options);
$rows = $mng->executeQuery("testdb.cars", $query);
foreach ($rows as $row) {
print_r($row);
}
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
在示例中,我们隐藏了第一个字段_id
。
$options = ["projection" => ['_id' => 0]];
投影以projection
数组指定。 在这里,我们隐藏_id
字段。
$query = new MongoDB\Driver\Query($filter, $options);
投影在MongoDB\Driver\Query
的第二个参数中传递。
$ php projection.php
stdClass Object
(
[name] => Audi
[price] => 52642
)
stdClass Object
(
[name] => Mercedes
[price] => 57127
)
...
这是projection.php
脚本的部分输出。 仅返回名称和价格字段。
限制数据输出
limit
查询选项指定要返回的文档数,sort
选项指定排序顺序。
read_limit.php
<?php
try {
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$query = new MongoDB\Driver\Query([], ['sort' => [ 'name' => 1], 'limit' => 5]);
$rows = $mng->executeQuery("testdb.cars", $query);
foreach ($rows as $row) {
echo "$row->name : $row->price\n";
}
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
该示例从testdb.cars
集合中读取所有数据,将输出限制为五辆汽车,并按照汽车名称升序排序。
$query = new MongoDB\Driver\Query([], ['sort' => [ 'name' => 1], 'limit' => 5]);
我们在查询的第二个参数中指定sort
和limit
选项。
$ php read_limit.php
Audi : 52642
Bentley : 350000
Citroen : 21000
Hummer : 41400
Mercedes : 57127
这是read_limit.php
脚本的输出。
批量写入
MongoDB\Driver\Manager::executeBulkWrite
方法执行一个或多个写操作,包括插入,更新和删除。
bulkwrite.php
<?php
try {
$mng = new MongoDB\Driver\Manager("mongodb://localhost:27017");
$bulk = new MongoDB\Driver\BulkWrite;
$doc = ['_id' => new MongoDB\BSON\ObjectID, 'name' => 'Toyota', 'price' => 26700];
$bulk->insert($doc);
$bulk->update(['name' => 'Audi'], ['$set' => ['price' => 52000]]);
$bulk->delete(['name' => 'Hummer']);
$mng->executeBulkWrite('testdb.cars', $bulk);
} catch (MongoDB\Driver\Exception\Exception $e) {
$filename = basename(__FILE__);
echo "The $filename script has experienced an error.\n";
echo "It failed with the following exception:\n";
echo "Exception:", $e->getMessage(), "\n";
echo "In file:", $e->getFile(), "\n";
echo "On line:", $e->getLine(), "\n";
}
?>
该脚本会插入一辆新车,更新一辆车,然后删除一辆车。
$bulk = new MongoDB\Driver\BulkWrite();
MongoDB\Driver\BulkWrite
收集一个或多个应发送到服务器的写操作。
$doc = ['_id' => new MongoDB\BSON\ObjectID, 'name' => 'Toyota', 'price' => 26700];
这是要插入的新文档。 MongoDB\BSON\ObjectID
生成一个新的ObjectId
。 它是用于唯一标识集合中文档的值。
$bulk->insert($doc);
使用insert()
方法创建一个插入操作。
$bulk->update(['name' => 'Audi'], ['$set' => ['price' => 52000]]);
使用update()
方法创建更新操作。 $set
运算符将字段的值替换为指定的值。
$bulk->delete(['name' => 'Hummer']);
使用delete()
方法创建删除操作。
$mng->executeBulkWrite('testdb.cars', $bulk);
executeBulkWrite()
对testdb.cars
集合执行三个操作。
> db.cars.find()
{ "_id" : ObjectId("571e05a6c4a3bc7dc758b457"), "name" : "Audi", "price" : 52000 }
{ "_id" : ObjectId("571e05b5c4a3bc7dc758b458"), "name" : "Mercedes", "price" : 57127 }
{ "_id" : ObjectId("571e05bec4a3bc7dc758b459"), "name" : "Skoda", "price" : 9000 }
{ "_id" : ObjectId("571e05c7c4a3bc7dc758b45a"), "name" : "Volvo", "price" : 29000 }
{ "_id" : ObjectId("571e05d0c4a3bc7dc758b45b"), "name" : "Bentley", "price" : 350000 }
{ "_id" : ObjectId("571e05e0c4a3bc7dc758b45c"), "name" : "Citroen", "price" : 21000 }
{ "_id" : ObjectId("571e05fcc4a3bc7dc758b45e"), "name" : "Volkswagen", "price" : 21600 }
{ "_id" : ObjectId("5720a4e581365b0e9414d0e1"), "name" : "Toyota", "price" : 26700 }
使用mongo
工具确认更改。
在本教程中,我们使用了 MongoDB 和 PHP。