0

我在需要使用的项目中有一个特定要求MongoDB Collection,其中包含Documents不同的字段集。

例如,这两个Documents在同一个集合中。和字段namefoo必填项。

{ '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);
    } 
}

当前的解决方案一点也不优雅,需要同时调用insertupdate调用来插入单个Document. Document在持久化、读取和更新时注入自定义字段的更好方法是什么?

4

0 回答 0