Пользовательские поля в документе Doctrine MongoDB

У меня есть конкретные требования в проекте, который требует использования MongoDB Collection, который содержит Documents с разными наборами полей.

Например, эти два Documents находятся в одной коллекции. name а также foo поля обязательны для заполнения.

{ 'name': 'scott', 'foo': 'abc123' }
{ 'name': 'jack' , 'foo': 'def456', 'bar': 'baz' }

Используя Doctrine MongoDB ODM, Document поля будут указаны в Document учебный класс.

На данный момент у меня есть мой Document класс, расширяющий следующее BaseDocument и создал пользовательский слушатель для PostPersist событие, чтобы обновить сохраненный Document с настраиваемыми полями.

BaseDocument учебный класс:

class BaseDocument
{
    protected $customFields;

    public function __construct()
    {
        $this->customFields = array();
    }

    public function setCustomField($name, $value)
    {
        if (\property_exists($this, $name)) {
            throw new \InvalidArgumentException("Object property '$name' exists, can't be assigned to a custom field");
        }
        $this->customFields[$name] = $value;
    }

    public function getCustomField($name)
    {
        if (\array_key_exists($name, $this->customFields)) {
            return $this->customFields[$name];
        }

        throw new \InvalidArgumentException("Custom field '$name' does not exists");
    }

    public function getCustomFields()
    {
        return $this->customFields;
    }
}

postPersist слушатель:

class CustomFieldListener
{
    public function postPersist(LifecycleEventArgs $args)
    {   
        $dm = $args->getDocumentManager();
        $document = $args->getDocument();

        $collection = $dm->getDocumentCollection(\get_class($document));
        $criteria = array('_id' => new \MongoID($document->getId()));
        $mongoDoc = $collection->findOne($criteria);
        $mongoDoc = \array_merge($mongoDoc, $document->getCustomFields());;
        $collection->update($criteria, $mongoDoc);
    } 
}

Текущее решение совсем не элегантно и требует как insert а также update призывает вставить один Document, Каков лучший способ ввести пользовательские поля в Document при сохранении, чтении и обновлении?

0 ответов

Другие вопросы по тегам