Документ наследования ODM с ошибкой создания схемы типа SINGLE_COLLECTION

У меня есть документ наследования с типом SINGLE_COLLECTION, настроенным в моем приложении Symfony 4.4. Когда я запускаю команду bin/console doctrine:mongodb:schema:create, возникает ошибка a collection 'db.Person' already exists.

Все было сделано по документации: https://www.doctrine-project.org/projects/doctrine-mongodb-odm/en/2.0/reference/inheritance-mapping.html#single-collection-inheritance

src / Document / Person.php

<?php

namespace App\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document
 * @MongoDB\InheritanceType("SINGLE_COLLECTION")
 * @MongoDB\DiscriminatorField("type")
 * @MongoDB\DiscriminatorMap({"person"=Person::class, "employee"=Employee::class})
 */
class Person
{
    /**
     * @var integer|null
     *
     * @MongoDB\Id
     */
    protected $id;

    /**
     * @var string|null
     *
     * @MongoDB\Field(type="string")
     */
    protected $name;
}

src / Document / Employee.php

<?php

namespace App\Document;
use Doctrine\ODM\MongoDB\Mapping\Annotations as MongoDB;

/**
 * @MongoDB\Document
 */
class Employee extends Person
{

    /**
     * @var string|null
     *
     * @MongoDB\Field(type="string")
     */
    protected $grade;
}

Похоже, что команда пытается создать коллекцию БД для каждого класса Document, игнорируя объявление типа SINGLE_COLLECTION.

Как это исправить?

Коллекции в MongoDB не нужно создавать явно. Что такое неудачная операция?   —  person Mateusz K.    schedule 05.05.2020

Я знаю, что это не нужно, но я предпочитаю создавать полную схему БД для индексов. Расширенный ответ об ошибке: MongoDB\Driver\Exception\CommandException: a collection 'db.Person' already exists in vendor/mongodb/mongodb/src/Operation/CreateCollection.php:222   —  person Mateusz K.    schedule 05.05.2020

Что такое полная трассировка стека?   —  person Mateusz K.    schedule 05.05.2020

Олег, у меня не получается stacktrace. Когда я запустил bin/console doctrine:mongodb:schema:create -vvv, я получил ответ: a collection 'db.Person' already exists Created indexes for all classes   —  person Mateusz K.    schedule 06.05.2020

См. также:  Laravel красноречивый множественный принадлежит к раздаче
Понравилась статья? Поделиться с друзьями:
IT Шеф
Комментарии: 1
  1. Mateusz K.

    ODM odm:schema:create просматривает все метаданные и пытается создать коллекцию, не учитывая возможные отношения между ними. Правильное исправление было бы в SchemaManager ODM, чтобы либо проверить, существует ли коллекция, до создания или перехвата исключения, и игнорировать его в случае существующей коллекции.

    Я создал https://github.com/doctrine/mongodb-odm/issues/2182, чтобы отследить эту проблему. Если у вас будет свободное время, мы будем благодарны за PR!

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: