一如既往的搜了超级多的教程,又一如既往的大同小异,终于被我连接上了
首先很多教程都只讲了两个文件,一个是控制器,一个是配置文件,就算有讲模型类的也是说不用修改太多的,其实模型类才是关键,首先先列出几个我遇到的问题
第一个:Call to a member function selectCollection() on null
第二个:无法加载数据库驱动:Think\Db\Driver\Mongodb
第三个:Failed to connect to:127.0.0.1:27017:SASL Authentication failed on database 'test':Authentication failed
第四个:127.0.0.1:27017:not authorized for query on system.users
第一个问题是由于没有传入集合名,即使你以为自己传入了,通过在对应的模型类下设置参数就行了 protected $tableName = 'admin1';
第二个问题是由于配置时将 mongo 写成了 mongodb,
第三个是没有选择 admin 表进行登录,
第四个是你登录时操作的表超过了你登录所用帐号的权限
其次再来讲以下我失败的例子
我首先在模块下的 config.php 中配置了数据库的配置参数
'DB_TYPE' => 'mongo', // 数据库类型
'DB_HOST' => '127.0.0.1', // 服务器地址
'DB_NAME' => 'admin', // 数据库名
'DB_USER' => 'trouble i am in', // 用户名
'DB_PWD' => 'trouble i am in', // 密码
'DB_PORT' => '27017', // 端口
(把 'DB_TYPE' => 'mongo', 设置成 'DB_TYPE' => 'mongodb', 就会出现上面的第二类问题)
但是这样配置完了之后问题就来了,我上面登录的是 admin 数据库,但是我实际上操作的又是 test 的表,如果上面修改成 test 的表,就会出现上面的第三类错误,而在成功登录 admin 数据库后,我再使用 thinkphp 的 db() 重新连接别的数据库多转几圈之后脑子就昏了,而且我也没有成功过。
所以为了解决上面的问题,直接抛弃配置文件,在模型类中设置相应数据库的信息
第一步,模型文件
<?php
namespace Home\Model\MongoDB;
use Think\Model\MongoModel;
class Admin1MongoModel extends MongoModel{
//使用下面这句话进行数据库的连接,其中的各个位置的含义,查看我的这篇文章
protected $connection = 'mongo://admin1:admin1@127.0.0.1:27017/admin'; //这里跟前一篇使用 MongoClient 连接 MongoDB 的格式一样,注意后面一定要是 admin
protected $tableName = 'admin1'; //在这里指定要操作的表
protected $dbName = 'test'; //这里指定数据库的名字
}
?>
在模型文件中定义好这些参量之后一定要配置文件里面的内容去掉,否则还是以配置文件为主的
第二步,在控制器中测试连接是否成功
<?php
namespace Home\Controller;
use Think\Controller;
use Home\Model\MongoDB\Admin1MongoModel;
public function index() {
$mondel = new Admin1MongoModel("admin1"); //这里传不传如表名都没关系
$message = $mondel->find(); //简单的查询一个数据
var_dump($message);
}
}
如果你的用户名和密码正确,权限足够,那么就可以查询到你的数据