【问题标题】:Ordering embedded documents with Doctrine ODM使用 Doctrine ODM 订购嵌入式文档
【发布时间】:2020-10-16 09:19:49
【问题描述】:

我正在尝试订购我的嵌入文档。

字段如下所示

/**
 * @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更新了索引

但是我的图片没有排序。索引是这样做的吗?

【问题讨论】:

  • 我用的不是orm orm,而是ODM,你绝对不能用mongodb的order by。

标签: mongodb symfony doctrine doctrine-odm


【解决方案1】:

索引不用于以任何方式对文档进行排序,它们告诉数据库对数据进行索引,以便可以有效地搜索它。在 Doctrine 的 ORM 中有一个 @OrderBy 注释,但遗憾的是它还没有进入 ODM(还)。解决方案是在 ODM 本身中原生支持此类内容,或者您​​可以为嵌入的文档使用自定义集合。

在这里您可以找到custom collections 的文档,这里是指向我的包的链接,旨在启动您自己的实现: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 = [];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-11
    • 2012-12-20
    • 1970-01-01
    • 2012-01-16
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 2016-08-04
    相关资源
    最近更新 更多