在使用Doctrine MongoDB ODM时如何存储ObjectId?

时间:2011-07-10 22:02:43

标签: php doctrine doctrine-orm mongodb

我想手动存储引用,而不是让ODM使用DBRef类型。

我可以选择将我想要引用的_id存储为@String(例如“4e18e625c2749a260e000024”),但是如何在此字段中存储ObjectId的实例呢?

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

使用MongoId对象而不是字符串保存它将为我节省一半的空间。它与@Id注释使用的数据类型相同,但@Id只能在文档中使用一次。

完成此任务的正确注释是什么?

2 个答案:

答案 0 :(得分:9)

更新:现在有这种类型的官方支持。在注释中使用@ObjectId@Field(type="object_id")来使用ObjectId / MongoId类型。没有必要使用下面的解决方案。

另外,请使用github.com/doctrine/mongodb-odm中的最新主代码,并避免在网站上使用该版本(它已过时)。


解决方案(已弃用)

看起来还没有支持。我在IRC频道上讨论了这个问题,并在此打开了一张票:https://github.com/doctrine/mongodb-odm/issues/125

临时修复方法是定义自定义类型,并在Document类中使用@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' );

答案 1 :(得分:0)

尝试:

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