У меня есть документ наследования с типом 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
ODM
odm:schema:create
просматривает все метаданные и пытается создать коллекцию, не учитывая возможные отношения между ними. Правильное исправление было бы вSchemaManager
ODM, чтобы либо проверить, существует ли коллекция, до создания или перехвата исключения, и игнорировать его в случае существующей коллекции.Я создал https://github.com/doctrine/mongodb-odm/issues/2182, чтобы отследить эту проблему. Если у вас будет свободное время, мы будем благодарны за PR!