PHP使用新版MongoDB1.4–composer安装、使用与填坑

演示环境说明

  • 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/

  • 选择数据库
  1. 方法一:$db = (new MongoDB\Client)->db1
  2. 方法二:
$client = new MongoDB\Client("mongodb://xxx.xx.xxx:25565", [ ... ]);
$db = $client->selectDatabase("db1");

官方文档:https://docs.mongodb.com/php-library/current/reference/method/MongoDBClient-selectCollection/

  • 选择文档集
  1. 方法一:$collection= (new MongoDB\Client)->db1->collection1
  2. 方法二:
$client = new MongoDB\Client("mongodb://xxx.xx.xxx:25565", [ ... ]);
$db = $client->selectDatabase("db1");
$collection  = $db->selectCollection("collection1");
  1. 方法三:
$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());

操作结果中的getMatchedCountgetModifiedCount直接返回数字,可以直接用的。

更新于2019-3-5,可能会持续更新填坑记录。

You may also like...

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注