0

を使用する必要があるプロジェクトで、さまざまなフィールド セットMongoDB Collectionを含む特定の要件があります。Documents

たとえば、これら 2 つ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の呼び出しが必要です。永続化、読み取り、更新時にカスタムフィールドを挿入するより良い方法は何ですか?updateDocumentDocument

4

0 に答える 0