を使用する必要があるプロジェクトで、さまざまなフィールド セット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
の呼び出しが必要です。永続化、読み取り、更新時にカスタムフィールドを挿入するより良い方法は何ですか?update
Document
Document