在 Laravel 中使用 MongoDB

  • 环境准备
  1. 安装 MongoDB
  2. 安装 PHP-MongoDB 扩展

安装 Laravel-MongoDB

  • 推荐组件
composer require jenssegers/mongodb
  • 注册服务
Jenssegers\Mongodb\MongodbServiceProvider::class,
  • 添加 Facades
'Mongo'     => Jenssegers\Mongodb\MongodbServiceProvider::class,
  • 修改数据库配置文件 config/database.php 中
添加 MongoDB 的数据库的信息:
'mongodb' => [    
        'driver'   => 'mongodb',    
        'host'     => 'localhost',    
        'port'     => 27017,    
        'database' => 'mydb',    
        'username' => '',    
        'password' => '',
],

'default' => env('DB_CONNECTION', 'mysql'),

改成:

'default' => env('DB_CONNECTION', 'mongodb'),

使用篇

查询构造器

// 建立一个 UserController.php 控制器
php artisan make:controller UserController
参考代码:
use DB;   //引用数据库

class MongoController extends Controller{
    pubulic function index(){
        DB::collection('users')               //选择使用users集合
              ->insert([                          //插入数据
                      'name'  =>  'tom', 
                      'age'     =>   18
                  ]);
    }

    $res = DB::collection('users')->all();  //查询所有数据
    dd($res);                                            //打印数据
}
  • 设置一个访问路由, 然后测试

如果你没有修改默认的数据库配置(默认还是 MySQL ),那么你在使用 MongoDB 的时候就要指定使用 MongoDB 了

  • 例如:
use DB;   //引用数据库

class MongoController extends Controller{
    pubulic function index(){
        DB::connection('mongodb')       //选择使用mongodb
              ->collection('users')           //选择使用users集合
              ->insert([                          //插入数据
                      'name'  =>  'tom', 
                      'age'     =>   18
                  ]);
    }

    $res = DB::connection('mongodb')->collection('users')->all();   //查询所有数据
    dd($res);                                            //打印数据
}

有关查询构造器的使用和 MySQLi 的方式是一样的,参照 Laravel 文档查询构造器

Eloquent 模型

  • 在 config/app.php 配置文件中配置 MongoDB 的 Eloquent 类的别名
'Moloquent' => 'Jenssegers\Mongodb\Eloquent\Model',
  • 新建一个 User.php 的 Model 类
php artisan make:model User
  • 参考代码
<?php
    namespace App;
    use Moloquent;
    use DB;

    class Users extends Moloquent{    
        protected $connection = 'mongodb';  //库名    
        protected $collection = 'users';     //文档名    
        protected $primaryKey = '_id';    //设置id    
        protected $fillable = ['id', 'name', 'phone'];  //设置字段白名单
    }
  • 在 UserController.php 控制器中这样使用
<?phpnamespace 
    App\Http\Controllers;
    use App\Users;    //引入Users模型

    class MongoController extends Controller{
        public function index(){
        Users::create([                      //插入数据
            'id'     =>1,
            'name'   =>'tom',
            'phone'  =>110]);
        }

        dd(Users::all());          //查询并打印数据

PS

感谢关注「GitHub 热门」公众号,带你了解技术圈内热门新鲜事!

file

本作品采用《CC 协议》,转载必须注明作者和本文链接
感谢关注「GitHub 热门」公众号
本帖由系统于 7年前 自动加精
Destiny
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 31
Summer

markdown 乱掉了

8年前 评论
Destiny

@Summer 我去...怎么变了....我改改

8年前 评论
Destiny

@小小海 ...?

8年前 评论
Destiny

@小小海 不客气哈,你也多分析分析让我们学习下

8年前 评论

config/database.php 配置哪里 应该是改成 'default' => env('DB_CONNECTION', 'mongodb'),

8年前 评论
Kurisu

Eloquent 部分

class Users extends Moloquent{
protected $connection = 'mongodb'; //库名
protected $collection = 'users'; //文档名
这里似乎写错了
collection应该代表的是集合

7年前 评论
Kurisu

补充(170922)

目前Laravel-mongoDB稳定版本 v3.2.3在Laravel5.5下composer require 会报错

可以考虑composer require jenssegers/mongodb v3.3.0-alpha

https://github.com/jenssegers/laravel-mong...

7年前 评论
Destiny

@Kurisu :+1:

7年前 评论

我连接时间报错,是为什么呢?
Unauthorized: not authorized on zsfuaci to execute command { find: "test", filter: { name: "chenjiantan" }, limit: 1, $db: "zsfuaci", $readPreference: { mode: "primaryPreferred" }, lsid: { id: UUID("590af18b-e910-4864-9d3b-9d3f70dadbe3") } }

7年前 评论
hiwangqi

@Kurisu 您说protected $collection = 'users'; //文档名 写错了 应该怎么改呢 请教下

7年前 评论

楼主你好,我laravel是5.4的怎么安装?

7年前 评论
hankin

我链接数据库 protected $connection = 'mongodb'; mongodb也配置好了
但是出现错误 Call to a member function prepare() on null

7年前 评论
perfectworld 5年前
eiphper 5年前
hankin

如果用户模型继承了Moloquent 如何实现认证

7年前 评论

执行命令 composer require jenssegers/mongodb 出现以下错误
file
我现在环境是php 7 lavarel5.5
如果你有同样问题可是使用这个命令
composer require jenssegers/mongodb ^3.3 -vvv

6年前 评论
Destiny

@zhaoyang365 看上面的提示,有版本约束的提示。

6年前 评论

如果要删除laravel上的mongodb怎么办;一直提示Class/Mongodb not found

6年前 评论

如果要在模型中给mongoDB数据库新增索引应该要怎么办呢?

6年前 评论

能否打印mongodb的执行语句

6年前 评论
wanghan

楼主你好,laravel这个mongo拓展包jenssegers/mongodb,insert时候不支持加入参数

public function insert(array $values)
    {
        // Intercept operations on embedded models and delegate logic
        // to the parent relation instance.
        if ($relation = $this->model->getParentRelation()) {
            $relation->performInsert($this->model, $values);

            return true;
        }

        return parent::insert($values);
    }

我想加入一个['ordered'=>false]忽略一下已经存在的数据,需要怎么做呢?

5年前 评论
_jue

有这个查询的文档吗,查询所有数据之后再查询子集就出问题了。

5年前 评论

请问如何查询时对字段进行别名处理?急急急

5年前 评论
_jue

@DongXin 查出来之后再用集合处理一下,这样试试?

5年前 评论

请问如何打印执行语句?使用DB::getQueryLog()无法获取

5年前 评论
casey 4年前

@DongXin 请问下你找到方法打印了吗

5年前 评论
DongXin 5年前

created_at字段包含时分秒,想对created_at的年月日分组该怎么操作?

public function userinfo(Request $request)
 {
     $data = UserInfoPagePoint::orderBy('created_at', 'desc')
         ->groupBy('version', 'created_at')
         ->paginate($request->page_size ?? 15);
     return $data;
 }  
5年前 评论

请问具体的使用语法 和 mysql 的orm操作方法一样吗

5年前 评论

请问laravel mongodb怎么分组查询?没有aggregate方法吗

4年前 评论

'Mongo' 的Facade 貌似没有demo哦~~

4年前 评论

laravel 版本 8.38

mongodb composer 扩展包版本 "jenssegers/mongodb": "^3.8",

执行示例代码报错

$res = DB::connection('mongodb')->collection('users')->all();

报错信息如下

Call to undefined method Jenssegers\Mongodb\Query\Builder::all()

改成 get 方法获取正常

$res = DB::connection('mongodb')->collection('users')->get();

其它方法示例

$res = DB::connection('mongodb')->collection('users')->first();

$res = DB::connection('mongodb')->collection('users')->where('name','tom')->get();

$res = DB::connection('mongodb')->collection('users')->where('age','>',17)->get();

相关理解

SQL术语/概念 MongoDB术语/概念 解释/说明
database database 数据库
table collection 数据库表/集合
row document 数据记录行/文档
column field 数据字段/域
index index 索引
table joins 表连接,MongoDB不支持
primary key primary key 主键,MongoDB自动将_id字段设置为主键
4年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!