trismegiste/strangelove-bundle

我是如何学会不再担心ORM并爱上MongoDb BSON的

2.0.10 2023-12-26 13:29 UTC

This package is not auto-updated.

Last update: 2024-09-17 16:40:06 UTC


README

How I Learned to Stop Worrying about Doctrine and Love MongoDb BSON

这是一个symfony扩展包,用于停止追逐神话中的对象-数据库,或者它的虚假近似,即Doctrine。

MongoDb

一个几乎零配置的对象数据映射器(ODM)用于MongoDB。它是一个微数据库层,具有自动映射,依赖于BSON类型。它旨在为MongoDB的**高级用户**提供,这些用户了解并在无模式数据库上理解模型的增长。

当我提到“微”,我的意思是NCLOC总和大约为一百。因此,它非常快。

安装

包含扩展包

$ composer require trismegiste/strangelove-bundle

由于配置文件 strangelove.yaml 尚不存在,您可能在清除缓存时遇到错误。

配置扩展包

只需运行向导并回答问题即可

$ vendor/bin/strangelove-wizard.php

在集合上创建存储库

创建 Trismegiste\Strangelove\MongoDb\DefaultRepository 的子类,并扩展其业务功能。

注册服务

要将名为 MyMovies 的存储库类注册到 'movies' 集合中,只需在 services.yaml 配置文件中添加以下内容:

services:
    # ... some services
    App\Repository\MyMovies:
        $collectionName: movies

如何

由于MongoDB中对一个文档具有原子性,因此必须存储复杂的树形对象。如果您避免了循环引用,此ODM会将您的对象以综合结构存储到MongoDB集合中。

每个对象都必须实现一个接口并使用一个特性

class MyEntity implements \MongoDB\BSON\Persistable {
    use \Trismegiste\Strangelove\MongoDb\PersistableImpl;
}

“顶级文档”或“根文档”,即拥有主键(即MongoDB中的字段“_id”),必须实现Root接口并使用RootImpl特性。

class MyDocument implements \Trismegiste\Strangelove\MongoDb\Root {
    use \Trismegiste\Strangelove\MongoDb\RootImpl;
}

存储库

有一个针对集合的默认存储库: DefaultRepository

加载

$record = $myRepository->load($primaryKey);

持久化

$myRepository->save($oneObjectInheritingFromRoot);
$rimaryKey = $oneObjectInheritingFromRoot->getPk();

搜索

$iter = $myRepository->search(['price' => ['$ne' => null]]);
foreach($iter as $record) {
   var_dump($record);
}

此类实现了Repository接口。请阅读有关它的phpdoc。

类型

  • 在您的模型中不要使用DateTime,请使用BsonDateTime,您有一个用于将DateTime转换为BsonDateTime的AbstractType,以替换Symfony DateType。
  • 在您的模型中不要使用SplObjectStorage,请使用BsonObjectStorage。
  • 在您的模型中不要使用SplFixedArray,请使用BsonFixedArray。

请阅读有关MongoDB中BSON序列化的文档以了解更多信息: MongoDB\BSON\Persistable接口

性能

包含约一千个嵌入对象的复杂对象需要2.5秒在廉价的笔记本电脑上存储。加载和填充需要约1.8秒。

内部结构

此ODM完全依赖于MongoDB的BSON API。您的对象可以是您想要的任何东西:没有注解,没有对构造函数或扩展某些强制具体类的约束。序列化和反序列化是在用C编写的驱动程序中进行的,而不是PHP,这就是它为什么这么快的原因。

测试

此库使用PHPUnit进行了全面测试。只需运行

$ vendor/bin/phpunit

在 DefaultRepositoryTest.php 中可以找到完整功能测试。

迭代器

目前,有一个用于Iterator对象的装饰器: ClosureDecorator。它用于装饰MongoDB存储库(如上所述)创建的光标上的迭代器。

代码覆盖率

代码覆盖率配置包含在 phpunit.xml 中。只需运行

$ phpdbg -qrr vendor/bin/phpunit

HTML结果存储在 ./docs/coverage。