我在需要使用的项目中有一个特定要求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
在持久化、读取和更新时注入自定义字段的更好方法是什么?