演示环境说明
- PHP 7.2
- Win 10
- composer 1.7.3
说在前面
多数博客中还在使用new MongoClient()
这样的链接方式操作MongoDB,但是MongoDB的官方文档已经建议只用1.4版本的数据库驱动,但文档中又略有坑点,所以我把我的实践经历写一下。未来将会不断完善。文章主要解决了以下坑点:
- 连接远程MongoDB的参数如何设置,如何定义帐号密码,主机地址与端口。
- 如何选择数据库与文档集
- 如何将find和findOne的结果转换为json
- 如何使用插入和更新的结果
composer安装
根据官方文档:https://docs.mongodb.com/php-library/current/tutorial/install-php-library/
我们可以使用composer完成MongoDB插件的安装。
安装命令:composer require mongodb/mongodb
连接MongoDB
官方文档:https://docs.mongodb.com/php-library/current/reference/method/MongoDBClient__construct/
官方的大量例子中,都只使用一个简短的命令链接到本机的MongoDB,但实际上我们通常要指定很多参数,我给大家举个常用的例子就懂了。
$client = new MongoDB\Client(
'mongodb://rs1.example.com,rs2.example.com/'
[
'username' => 'myUsername',
'password' => 'myPassword',
'ssl' => true,
'replicaSet' => 'myReplicaSet',
'authSource' => 'admin',
],
);
第一个参数为unix链接地址(即为主机地址与端口号),第二个参数可以设置常用的参数。
第三个参数省略了,有需要的看文档(我测试设置了typeMap
参数是无效的)
官方短样例:$client = (new MongoDB\Client)
选择数据库与文档集
官方文档:https://docs.mongodb.com/php-library/current/reference/method/MongoDBClient-selectDatabase/
- 选择数据库
- 方法一:
$db = (new MongoDB\Client)->db1
- 方法二:
$client = new MongoDB\Client("mongodb://xxx.xx.xxx:25565", [ ... ]);
$db = $client->selectDatabase("db1");
官方文档:https://docs.mongodb.com/php-library/current/reference/method/MongoDBClient-selectCollection/
- 选择文档集
- 方法一:
$collection= (new MongoDB\Client)->db1->collection1
- 方法二:
$client = new MongoDB\Client("mongodb://xxx.xx.xxx:25565", [ ... ]);
$db = $client->selectDatabase("db1");
$collection = $db->selectCollection("collection1");
- 方法三:
$client = new MongoDB\Client("mongodb://xxx.xx.xxx:25565", [ ... ]);
$collection = $client ->selectCollection("db1", "collection1");
查询数据
官方文档:https://docs.mongodb.com/php-library/current/tutorial/crud/#query-documents
查询功能可以直接看文档。但是难点在于官方样例总是使用var_dump输出结果,导致我们不能正确的获取array形式的数据。
- 查询一个
查询时若要用的_id
不能直接传字符串进去,要转换为Objectid才能查询!!
查询结果要使用(array)
和getArrayCopy()
才能转换为array类型!!
经过如下繁琐操作才能完成使用_id
查询,并且将结果转换为array类型的变量。
$collection = $this->get('mongodb')->selectCollection('mission');
$mongo_id = '5c7d5e749eb5ef1e100011b2';
$mongo_id = new MongoDB\BSON\ObjectId($mongo_id);
$select_result = $collection->findOne(['_id' => $mongo_id]);
$select_result = (array)$select_result->getArrayCopy();
$select_result['_id'] = ((array)$select_result['_id'])['oid'];
- 查询多个
查询结果要使用(array)
和getArrayCopy()
才能转换为array类型!!
$collection = $this->get('mongodb')->selectCollection('mission');
$select_result = $collection->find(['name' => '123']);
$select_result = (array)$select_result->toArray();
最后我们得到一个数组,里面储存个多个查询到的数据。
插入数据
官方文档:https://docs.mongodb.com/php-library/current/tutorial/crud/#insert-documents
这里可以直接看文档,我引用文档的例子:
- 新增一个
$collection = (new MongoDB\Client)->test->users;
$insertOneResult = $collection->insertOne([
'username' => 'admin',
'email' => 'admin@example.com',
'name' => 'Admin User',
]);
printf("Inserted %d document(s)\n", $insertOneResult->getInsertedCount());
var_dump($insertOneResult->getInsertedId());
- 新增多个
$collection = (new MongoDB\Client)->test->users;
$insertManyResult = $collection->insertMany([
[
'username' => 'admin',
'email' => 'admin@example.com',
'name' => 'Admin User',
],
[
'username' => 'test',
'email' => 'test@example.com',
'name' => 'Test User',
],
]);
printf("Inserted %d document(s)\n", $insertManyResult->getInsertedCount());
var_dump($insertManyResult->getInsertedIds());
这个不难,但是难点在于官方样例总是使用var_dump输出结果,导致我们不能正确的获取array形式的数据,也不方便转换为json数据。下面请看我的样例,简洁明了。
$collection = $this->get('mongodb')->selectCollection('mission');
$insert_result = $collection->insertOne($new_data);
$insert_result = (array)$insert_result->getInsertedId();
$insert_result['_id'] = $insert_result['oid'];
unset($insert_result['oid']);上述
核心点在于(array)$insert_result->getInsertedId()
,直接转化为array即可,在PHP官方中有描述,该对象可以直接被序列号为array序列,所以不用使用函数进行转换。
上述例子中$insert_result的结果为:
{
"_id": "5c7d5e749eb5ef1e100011b2"
}
更新数据
官方文档:https://docs.mongodb.com/php-library/current/tutorial/crud/#update-documents
引用官方样例:
- 更新一个数据
$collection = (new MongoDB\Client)->test->users;
$collection->drop();
$collection->insertOne(['name' => 'Bob', 'state' => 'ny']);
$collection->insertOne(['name' => 'Alice', 'state' => 'ny']);
$updateResult = $collection->updateOne(
['state' => 'ny'],
['$set' => ['country' => 'us']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
- 更新多个数据
$collection = (new MongoDB\Client)->test->users;
$collection->drop();
$collection->insertOne(['name' => 'Bob', 'state' => 'ny']);
$updateResult = $collection->updateOne(
['name' => 'Bob'],
['$set' => ['state' => 'ny']]
);
printf("Matched %d document(s)\n", $updateResult->getMatchedCount());
printf("Modified %d document(s)\n", $updateResult->getModifiedCount());
操作结果中的getMatchedCount
和getModifiedCount
直接返回数字,可以直接用的。
更新于2019-3-5,可能会持续更新填坑记录。