MongoDB
MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。MongoDB 提供了面向文档的存储方式,操作起来比较简单和容易,支持“无模式”的数据建模,可以存储比较复杂的数据类型,是一款非常流行的文档类型数据库
使用场景
- 网站实时数据处理。它非常适合实时的插入、更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性.
- 缓存。由于性能很高,它适合作为信息基础设施的缓存层。在系统重启之后,由它搭建的持久化缓存层可以避免下层的数据源过载
- 高伸缩性的场景。非常适合由数十或数百台服务器组成的数据库,它的路线图中已经包含对MapReduce引擎的内置支持
不适用场景
- 要求高度事务性的系统。
- 传统的商业智能应用。
- 复杂的跨文档(表)级联查询。
特点
- 模式自由,意味着对于存储在mongodb数据库中的文件,我们不需要知道它的任何结构定义。如果需要的话,你完全可以把不同结构的文件存储在同一个数据库里
- 面向集合存储,容易存储对象类型的数据,一个集合中可以存储无限多的文档。
- 支持完全索引,可以在任意属性上建立索引,包含内部对象
- 文件存储格式为BSON(JSON 的一种扩展)。BSON 是对二进制格式的JSON 的简称,BSON 支持文档和数组的嵌套。
名词概念
- 文档:
文档是 MongoDB 中数据的基本单位,类似于关系数据库中的行。多个键及其关联的值有序地放在一起就构成了文档。文档可以嵌套。文档中的键类型只能是字符串(相当于就是一个json对象)。列如:
{“greeting”:“hello,world”,“foo”: 3}
-
集合:
集合就是一组文档,类似于关系数据库中的表。集合是无模式的,集合中的文档可以是各式各样的。 -
数据库:
MongoDB 中多个文档组成集合,多个集合组成数据库。一个MongoDB 实例可以承载多个数据库。它们之间可以看作相互独立,每个数据库都有独立的权限控制
sql与mangodb名词对比
sql | mangodb |
---|---|
表(Table) | 集合(Collection) |
行(Row) | 文档(Document) |
列(Col) | 字段(Field) |
主键(Primary Key) | 对象 ID(Objectid) |
索引(Index) | 索引(Index) |
安装
本文以windows环境安装测试。
下载
官网:
https://www.mongodb.com/
步骤
-
点击“NEXT”
-
勾选同意协议,点击“Next"
-
选择自定义安装
-
安装完成打开软件
laravel 操作mango
首先需要你确定是否安装php mongodb的扩展,在phpinfo里面查看。还需要扩展对应composer包的版本
本文环境 php8.0.2/MongoDB 5.0.5/laravel9/composer 2.2.6
安装laravel-mongodb
在项目根目录执行:
composer require mongodb/laravel-mongodb
此处如果php mongodb的扩展不匹配会安装失败,此处需要mongodb的扩展,1.12以上
而我的版本是1.11
重新安装扩展,去官网下载扩展
https://windows.php.net/downloads/pecl/releases/mongodb/
找到对应的扩展,下载,然后安装好扩展,注意php版本,nts和ts的区别
再进行composer下载
composer require mongodb/laravel-mongodb:^3.9 -vvv
使用
laravel-mongodb的中文官方文档:https://www.mongodb.com/zh-cn/docs/drivers/php/laravel-mongodb/current/
- 更改配置
在env文件中写入以下配置
#mangodb 连接
DB_CONNECTION=mongodb
MONGODB_HOST=127.0.0.1
MONGODB_POST=27017
MONGODB_DB=test
-
创建provider
找到laravel的根目录下面的config目录,打开app.php文件,在providers数组里面,添加以下代码:
Jenssegers\Mongodb\MongodbServiceProvider::class
由于我上面安装的laravel-mongodb:^3.9 版本的,在4.0以前的版本,laravel-mongodb这个包叫:jenssegers/mongodb
所以在添加provider的时候需要注意引入名称。
- 创建模型
在Models目录下面创建animal.php文件,写入以下代码:
<?phpnamespace App\Models;//mongodb的模型,注意laravel-mongodb4.0以下的版本,命名空间的问题
use Jenssegers\Mongodb\Eloquent\Model;class Animal extends Model
{//连接类型protected $connection = 'mongodb';//需要批量更新和写入的字段protected $fillable = ['name', 'age', 'sex', 'hobby'];
}
- 编写curd
在控制器中添加一个测试类,编写逻辑
<?phpnamespace App\Http\Controllers;use App\Models\Animal;
use Illuminate\Routing\Controller as BaseController;class TestController extends BaseController
{public function create(){//创建数据$data=['name'=>'狗','age'=>2,'sex'=>1,'hobby'=>'吃骨头'];Animal::query()->create($data);}public function show(){//查询数据$data=Animal::query()->where('name','狗')->first();$data=Animal::query()->where('_id','663c2baa3d76000021004822')->first();dd($data);}public function uppdate(){//更新数据Animal::query()->where('_id','663c2baa3d76000021004822')->update(['name'=>'小狗']);}public function delete(){//删除数据Animal::query()->where('_id','663c2baa3d76000021004822')->delete();}
}
可以在mongodb可视化软件里面查看数据