mongodb - 使用 Doctrine ODM 订购嵌入式文档
问题描述
我正在尝试订购我的嵌入文档。
该字段看起来像这样
/**
* @ODM\EmbedMany(targetDocument=Image::class, strategy="set")
* @ODM\Index(keys={"order"="asc"})
* @Groups({"offer:read"})
*/
protected $images = [];
图像嵌入文档
namespace App\Document\Embedded;
use App\Document\Traits\NameableTrait;
use App\Document\Traits\OrderableTrait;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
/**
* @ODM\EmbeddedDocument
*/
class Image
{
use NameableTrait;
use OrderableTrait;
…
}
和可订购的特征
namespace App\Document\Traits;
use Doctrine\ODM\MongoDB\Mapping\Annotations as ODM;
use Symfony\Component\Serializer\Annotation\Groups;
trait OrderableTrait
{
/**
* @ODM\Field(type="int")
* @Groups({"offer:read"})
*
* @var int|null
*/
private $order;
public function getOrder(): int
{
return $this->order;
}
public function setOrder(int $order): void
{
$this->order = $order;
}
}
我更新了索引bin/console doctrine:mongodb:schema:update
但是我的图像没有被订购。索引是这样做的吗?
解决方案
索引不用于以任何方式对文档进行排序,它们告诉数据库对数据进行索引,以便可以有效地搜索它。在 Doctrine 的 ORM 中有一个@OrderBy
注释,但遗憾的是它还没有进入 ODM(还)。解决方案是在 ODM 本身中原生支持此类事情,或者您可以为嵌入的文档使用自定义集合。
在这里,您将找到自定义集合的文档,这里是我的包的链接,旨在启动您自己的实现:https ://github.com/malarzm/collections 。为了得到你需要的东西,你需要你自己的集合类,看起来像这样:
class SortableCollection extends Malarzm\Collections\SortedCollection
{
public function compare($a, $b)
{
return $a->getOrder() <=> $b->getOrder();
}
}
然后将其插入您的映射中:
/**
* @ODM\EmbedMany(targetDocument=Image::class, strategy="set", customCollection=SortableCollection::class)
* @ODM\Index(keys={"order"="asc"})
* @Groups({"offer:read"})
*/
protected $images = [];
推荐阅读
- r - 从 igraph 中的边缘列表创建对象
- javascript - 在第 41 行获取错误代码 setText() text parameter value(,New York Yankees) is not a uistring
- python - 为什么python在移动到子目录后看不到文件?
- ubuntu - VPN 问题 Meraki Ubuntu 20.04
- c++ - 检查函数是否有空主体
- nginx - 为 AWS Elastic Beanstalk 增加 nginx 中的 worker_connections
- r - 如何在geom_text中改变两个不同文本在相反方向的位置?
- reactjs - 我没有使用 Typescript 编写的 npm 包在安装时需要声明文件
- google-chrome - Chrome RSV 中的 Zeppelin 和 Netty 反向代理!= 0 并且没有协商扩展,RSV:4
- postgresql - 连接表时 Postgres 中的错误估计