2011-07-10 28 views
4

我想手動存儲,而不是讓ODM使用DBREF類型的引用。同時使用MongoDB的學說ODM你如何存儲一個的ObjectId?

我有選擇存儲_id我想引用作爲@String(例如 - 「4e18e625c2749a260e000024」),但我如何在此字段中存儲一個ObjectId實例嗎?

new \MongoId("4e18e625c2749a260e000024") <-- what's the annotation for this type? 

使用MongoId對象,而不是字符串會來救我在這個領域一半的空間保存。它與@Id註釋使用的數據類型相同,但@Id只能在Document中使用一次。

什麼」正確標註做到這一點?

回答

0

嘗試:

/** @Id(strategy="NONE") */ 
+0

註冊它,我試了一下。這不起作用。看起來你可以每個文檔只使用一次@Id。看起來不像它支持這種類型。如果我在NONE策略中使用@Id,則文檔的主標識符停止工作。看起來它會覆蓋先前定義的行爲。 – Dayson

9

更新:現在有這種類型的官方支持。在你的註釋使用的ObjectId/MongoId類型使用@ObjectId@Field(type="object_id")。無需使用下面的解決方案。

此外,使用從github.com/doctrine/mongodb-odm最新的主碼,並避免使用網站上的版本(它是過時的)。


解決方案(不建議使用)

看起來像有這種不支持呢。我討論在IRC頻道這個問題,在這裏開了票呢:https://github.com/doctrine/mongodb-odm/issues/125

一個臨時的解決將是定義自定義類型和文檔類使用像@Field(type="objectid")註解。

下面是我使用的是完成這一任務的自定義類型的代碼。

/** 
* Custom Data type to support the MongoId data type in fields 
*/ 
class ObjectId extends \Doctrine\ODM\MongoDB\Mapping\Types\Type 
{ 
    public function convertToDatabaseValue($value) 
    { 
     if ($value === null) { 
      return null; 
     } 
     if (! $value instanceof \MongoId) { 
      $value = new \MongoId($value); 
     } 
     return $value; 
    } 

    public function convertToPHPValue($value) 
    { 
     return $value !== null ? (string)$value : null; 
    } 
} 

使用

\Doctrine\ODM\MongoDB\Mapping\Types\Type::addType('objectid', 'ObjectId'); 
+0

'@ ObjectId'爲我工作。 – ChocoDeveloper