在 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 热门」公众号
本帖由系统于 6年前 自动加精
Destiny
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 31
Summer

markdown 乱掉了

7年前 评论
Destiny

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

7年前 评论
Destiny

@小小海 ...?

6年前 评论
Destiny

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

6年前 评论

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

6年前 评论
Kurisu

Eloquent 部分

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

6年前 评论
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...

6年前 评论
Destiny

@Kurisu :+1:

6年前 评论

我连接时间报错,是为什么呢?
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") } }

5年前 评论
hiwangqi

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

5年前 评论

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

5年前 评论
hankin

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

5年前 评论
perfectworld 4年前
eiphper 3年前
hankin

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

5年前 评论

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

5年前 评论
Destiny

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

5年前 评论

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

5年前 评论

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

4年前 评论

能否打印mongodb的执行语句

4年前 评论
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]忽略一下已经存在的数据,需要怎么做呢?

4年前 评论
_jue

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

4年前 评论

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

4年前 评论
_jue

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

4年前 评论

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

4年前 评论
casey 3年前

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

4年前 评论
DongXin 4年前

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;
 }  
3年前 评论

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

3年前 评论

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

3年前 评论

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

3年前 评论

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字段设置为主键
2年前 评论

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